首页 >web前端 >js教程 >如何在 JavaScript 中模拟属性级 noSuchMethod?

如何在 JavaScript 中模拟属性级 noSuchMethod?

DDD
DDD原创
2024-10-18 14:29:03638浏览

How to Emulate Property-Level noSuchMethod in JavaScript?

在 JavaScript 中模拟属性级 noSuchMethod

某些 JavaScript 实现(例如 Rhino 和 SpiderMonkey)中的 noSuchMethod 功能,允许处理未实现的方法。然而,类似的功能本身并不适用于属性。

ECMAScript 6 救援代理

ECMAScript 6 引入了代理,它提供了一种用于自定义基本操作(包括属性访问)的机制。通过利用代理陷阱,我们可以使用 __noSuchMethod__ 模拟属性查找所需的行为。

使用 ES6 代理的解决方案

<code class="javascript">function enableNoSuchMethod(obj) {
  return new Proxy(obj, {
    get(target, p) {
      if (p in target) {
        return target[p];
      } else if (typeof target.__noSuchMethod__ == "function") {
        return function(...args) {
          return target.__noSuchMethod__.call(target, p, args);
        };
      }
    }
  });
}</code>

示例用法

考虑以下示例:

<code class="javascript">function Dummy() {
  this.ownProp1 = "value1";
  return enableNoSuchMethod(this);
}

Dummy.prototype.test = function() {
  console.log("Test called");
};

Dummy.prototype.__noSuchMethod__ = function(name, args) {
  console.log(`No such method ${name} called with ${args}`);
  return;
};

var instance = new Dummy();
console.log(instance.ownProp1);
instance.test();
instance.someName(1, 2);
instance.xyz(3, 4);
instance.doesNotExist("a", "b");</code>

此代码将记录以下输出,演示属性的 noSuchMethod 模拟:

value1
Test called
No such method someName called with 1,2
No such method xyz called with 3,4
No such method doesNotExist called with a,b

以上是如何在 JavaScript 中模拟属性级 noSuchMethod?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn