我确信之前已经得到了明确的回答,我试图搜索它......也许我的搜索字词错了......
基本上我有一个对象myObject
,我有一组已定义的属性和方法。我想要做的是能够处理我尚未定义的属性和方法的调用/引用。
例如,假设我有这个:
var myObject = {
someProperty : 'foobar',
someFunction : function () { /* Do stuff */ }
}
目前,如果有人试图拨打myObject.someOtherFunction()
,JavaScript会对此大吼大叫。我想要做的是设置一种自动处理它的方法。因此,例如,我的对象只返回false,而不是JavaScript抛出错误。这可能吗?
另一种看待它的方法是:
var myObject = {
someFunction : function () { /* Do stuff */ }
magicBucket : function () { /* Do stuff */ }
}
如果我打电话给myObject.someFunction()
,那就是定义并做了些什么。我想要发生的是,如果我要调用myObject.someOtherFunction()
,而不是JavaScript抛出错误,它会调用myObject.magicBucket()
。
原因是我的客户在其网站上使用了第三方库。他们想停止使用它,但完全删除它需要花费大量的时间和精力。因此,作为一个短期解决方案,他们想知道我是否可以创建一个基本上什么都不做的虚拟文件。好吧,这个库使用了几个有很多方法的对象。我可以浏览所有内容并制作虚拟对象,但我想也许可能有一些简单的“全能”方法来做到这一点。
有些人提到先检查方法是否存在,将其包装在条件中还是try..catch等等。好吧,关键在于此时我无法触及对方法的实际调用。由于总体目标是最终完全删除编码,因此甚至不适用。
答案 0 :(得分:3)
有一个名为__noSuchMethod__
的特殊属性,它正是您刚刚描述的内容。然而,这是一个非标准的财产。它只适用于Firefox。以下是您使用它的方式:
var o = {
__noSuchMethod__: function (name, args) {
alert(name); // prints the name of the method
alert(args); // prints the array of arguments
}
};
o.abc(1, 2, 3); // OUTPUT: abc 1,2,3
然而,未来是proxy objects。以下是代理的简短教程:Proxy Tutorial
答案 1 :(得分:2)
不,你不能在JavaScript中拥有任意的getter。您可以在调用函数之前测试函数是否存在以防止错误:
if (myObject.someOtherFunction)
myObject.someOtherFunction();
或者,更好的是,如果你不知道它必然是一个功能:
if (typeof myObject.someOtherFunction == 'function')
myObject.someOtherFunction();
答案 2 :(得分:0)
你可以像这样创建一个包装函数:
function callFunction(fn, args) {
var funct = this[fn];
return (typeof funct == "function")
? funct.apply(this, args)
: false;
}
并致电:
callFunction("blah", [1, 2, 3]);
>>> false
一个例子:
this.foo = function(a, b) {
console.log(a);
return b;
}
callFunction("foo", [1, 2, 3]);
>>> 1
>>> 2 # return value
答案 3 :(得分:0)
关于代理的更新,这里是一个无限数组:
$ var squares = new Proxy([], {get:(target,key) => key*key});
$ squares[2]
4
$ Array.isArray(squares)
true
Unfortunately:
$ squares.length
NaN // Want Infinity.
还有一个虚拟对象:
$ x = new Proxy({}, {get:(target,key) => console.error("The computer says no", key)})
$ x.laugh
The computer says no laugh
后者会帮助OP制作一个虚拟对象,虽然需要一些黑魔法来判断返回什么样的虚拟对象。
最新参考:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Proxy