例如这段代码:
function stuff() {
this.onlyMethod = function () {
return something;
}
}
// some error is thrown
stuff().nonExistant();
有没有办法像 PHP 的
__call
作为对象内部的后备?function stuff() {
this.onlyMethod = function () {
return something;
}
// "catcher" function
this.__call__ = function (name, params) {
alert(name + " can't be called.");
}
}
// would then raise the alert "nonExistant can't be called".
stuff().nonExistant();
也许我会多解释一下我在做什么。
该对象包含另一个对象,该对象具有可以通过该对象直接访问的方法。但是这些方法对于每个对象都是不同的,所以我不能只是路由它们,我需要能够动态调用它们。
我知道我可以将其中的对象设为主对象的属性
stuff.obj.existant()
,但我只是想知道是否可以避免它,因为主对象是一种包装器,它只是临时添加一些功能(并且同时更容易访问该对象)。
最佳答案
嗯,看来有了和声(ES6),就会有办法,而且比其他的programing languages的方式复杂多了做。基本上,它涉及使用 Proxy 内置对象在对象上创建一个包装器,并修改其在其上实现的默认行为方式:
obj = new Proxy({},
{ get : function(target, prop)
{
if(target[prop] === undefined)
return function() {
console.log('an otherwise undefined function!!');
};
else
return target[prop];
}
});
obj.f() ///'an otherwise undefined function!!'
obj.l = function() {console.log(45);};
obj.l(); ///45
代理会将所有未被处理程序处理的方法转发到普通对象中。所以就像它不存在一样,并且您可以从代理修改目标。还有更多的处理程序,甚至一些修改原型(prototype)获取,以及任何属性访问的 setter 是的!。
正如您想象的那样,目前并非所有浏览器都支持此功能,但在 Firefox 中,您可以非常轻松地使用代理界面,只需转到 MDN docs
如果设法在此基础上添加一些语法糖,我会更高兴,但无论如何,在已经强大的语言中拥有这种力量真是太好了。祝你今天过得愉快! :)
PD:我没有复制rosettacode js条目,我更新了它。
关于javascript - 有没有办法捕捉访问不存在的属性或方法的尝试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2666602/