JavaScript中的任意对象方法和属性

时间:2013-08-28 14:35:19

标签: javascript object

我确信之前已经得到了明确的回答,我试图搜索它......也许我的搜索字词错了......

基本上我有一个对象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等等。好吧,关键在于此时我无法触及对方法的实际调用。由于总体目标是最终完全删除编码,因此甚至不适用。

4 个答案:

答案 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