某些 JavaScript 实现(例如 Rhino 和 SpiderMonkey)中的 noSuchMethod 功能,允许处理未实现的方法。然而,类似的功能本身并不适用于属性。
ECMAScript 6 引入了代理,它提供了一种用于自定义基本操作(包括属性访问)的机制。通过利用代理陷阱,我们可以使用 __noSuchMethod__ 模拟属性查找所需的行为。
<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中文网其他相关文章!