![](/img/trans.png)
[英]Access methods and properties of arbitrary Objective-C object from 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.