Preferences = {
XDPI:90,
YDPI:90,
*:function(missing_name) {"Tell Joe he forgot to implement " + missing_name+ " property or func"}
}
假设我有一个旧的/未记录的/缩小/ uglified类我想用我自己的实现替换。 我如何能够捕获新“对象”中可能遗漏的所有旧属性?
(假设非技术用户使用了很多客户端脚本(宏)。我想简化丢失功能的报告)
例如,如果脚本调用Preferences.CurrentPrinter
我希望Preferences对象诊断它缺少CurrentPrinter属性,而用户不必查看控制台
答案 0 :(得分: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)
。
答案 1 :(得分:1)
对于方法,您可以使用 noSuchMethod ,但它仅适用于Firefox https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/noSuchMethod
您可以从这篇文章中获得更多信息: Is there an equivalent of the __noSuchMethod__ feature for properties, or a way to implement it in JS?
答案 2 :(得分:0)
第六版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
P.S。幸运的是,如果您将来阅读并且所有浏览器都支持:)