繁体   English   中英

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

[英]Arbitrary object methods and properties in JavaScript

我确定之前已经明确回答了这个问题,并且我已经尝试搜索它..也许我的搜索词是错误的......

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

例如,假设我有这个:

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

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

另一种看待它的方式是这样的:

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

如果我调用myObject.someFunction() ,那么它已定义并执行某些操作。 我想要发生的是,如果我要调用myObject.someOtherFunction() ,而不是 JavaScript 抛出错误,它会调用myObject.magicBucket()

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

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

有一个名为__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

但是,未来是代理对象 以下是有关代理的简短教程: 代理教程

不,JavaScript中不能有任意的吸气剂。 但是,您可以在调用函数之前测试是否存在函数以防止错误:

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

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

if (typeof myObject.someOtherFunction == 'function')
    myObject.someOtherFunction();

您可以这样创建包装函数:

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

关于代理的更新,这是一个无限数组:

$ 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

使用 Proxy 可以进行以下工作:

function createPseudoObject() {
  return new Proxy(new Function(), { get() { return createPseudoObject() } })
}

例如。 createPseudoObject().foo.bar.toString()不会抛出错误并返回未定义。 通过使用new Function()作为虚拟对象的基础,我不仅可以引用任何属性,还可以调用虚拟对象上的任何函数。

也许有一些边缘情况没有被涵盖在内,但像这样的事情应该有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM