3
Preferences = {
 XDPI:90,
 YDPI:90,
 *:function(missing_name) {"Tell Joe he forgot to implement " + missing_name+ " property or func"}
}

假设我有一个旧的/未记录的/缩小的/丑陋的类,我想用我自己的实现替换。我怎样才能捕捉到我的新“对象”中可能缺少的所有旧属性?

(假设有很多非技术用户使用的客户端脚本(宏)。我想缓解缺少功能的报告)

例如,如果脚本调用Preferences.CurrentPrinter我希望 Preferences 对象诊断它缺少 CurrentPrinter 属性,而用户不必查看控制台

4

3 回答 3

2

ECMAScript 规范的第六版Proxy为此目的引入了对象:

http://www.ecma-international.org/ecma-262/6.0/#sec-proxy-objects

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

但这尚未得到广泛支持。在撰写本文时,只有 Edge 和 Firefox 浏览器会这样做:

http://caniuse.com/#feat=proxy

PS 如果您将来阅读该内容并且所有浏览器都已支持该内容,那您很幸运:)

于 2016-02-26T22:53:04.747 回答
1

您可能不想做这样的事情,undefined为不存在的属性返回对象是非常依赖的事情。

您可能应该做的只是检查您Preferences.member是否在需要该功能时未定义,而不是更改访问器在您的对象上工作的方式。


如果您坚持,尽管您可以做的是实现一个名为的方法,该方法get()根据传入的字符串获取属性并以这种方式进行所有调用。

Preferences = {
   varX=90;
   varY=90;
   get = function(arg) {
       if(typeof this[arg] != 'undefined') {
           return this[arg];
       }
       Console.log("{0} not found in Preferences".format(arg));
   };
}

然后不是做Preferences.varX你做的Preferences.get(varX)

于 2013-09-11T00:13:12.530 回答
1

对于可以使用noSuchMethod的方法,但它仅适用于 Firefox https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/noSuchMethod

您可以从这篇文章中获得更多信息: 属性是否有等效的 __noSuchMethod__ 功能,或者在 JS 中实现它的方法?

于 2013-09-11T00:38:26.560 回答