5

我敢肯定这之前已经明确回答过,我试图搜索它..也许我的搜索词是错误的......

基本上我有一个 object myObject,我有一组定义的属性和方法。我想要做的是能够处理对我尚未定义的属性和方法的调用/引用。

例如,假设我有这个:

var myObject = {
  someProperty : 'foobar',
  someFunction : function () { /* Do stuff */ }
}

目前,如果有人尝试调用myObject.someOtherFunction(),JavaScript 会大喊大叫。我想要做的是设置一种自动处理它的方法。例如,我的对象不是 JavaScript 抛出错误,而是返回 false。这可能吗?

另一种看待它的方式是:

var myObject = {
  someFunction : function () { /* Do stuff */ }
  magicBucket : function () { /* Do stuff */ }
}

如果我打电话myObject.someFunction(),那是定义并做一些事情。我想要发生的是,如果我要调用myObject.someOtherFunction(),而不是 JavaScript 抛出错误,它会调用myObject.magicBucket().

原因是我有一个客户在他们的网站上使用第三方库。他们想停止使用它,但完全删除它需要花费大量时间和精力。所以作为一个短期解决方案,他们想知道我是否可以制作一个基本上什么都不做的虚拟文件。嗯,这个库使用了几个有很多方法的对象。我可以遍历所有内容并制作虚拟对象,但我想也许有一些简单的“包罗万象”的方法可以做到这一点。

有些人提到先检查方法是否存在,将其包装在条件中或 try..catch 等。嗯,重点是此时我无法触及对方法的实际调用。而且由于总体目标是最终完全删除编码,因此它甚至不适用。

4

4 回答 4

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

然而,未来是代理对象。以下是关于代理的简短教程:代理教程

于 2013-08-28T15:09:08.237 回答
2

不,你不能在 JavaScript 中使用任意的 getter。您可以在调用函数之前测试它是否存在以防止错误:

if (myObject.someOtherFunction)
    myObject.someOtherFunction();

或者,更好的是,如果您不知道它一定是一个函数:

if (typeof myObject.someOtherFunction == 'function')
    myObject.someOtherFunction();
于 2013-08-28T14:40:23.873 回答
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
于 2013-08-28T14:48:33.867 回答
0

Proxies 的更新,这里是一个无限数组:

$ 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

于 2016-08-09T11:17:34.000 回答