javascript - 有没有办法捕捉访问不存在的属性或方法的尝试?

标签 javascript

例如这段代码:

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/

相关文章:

javascript - 如何在 CQ 组件中将一个 ecma 包含到另一个 ecma 中?

c# - 当使用其父类类型创建该对象时,如何使用 $.getJSON 返回该对象

javascript - 在 contenteditable 范围内检测自动换行

javascript - 如何在 Node.js 中提取字符串数组的一部分?

javascript - 没有 jQuery 或 Ajax 的链式选择

javascript - 如何判断一个对象是否是类型化数组?

javascript - 在固定大小的列中加载 html 正文内容

javascript - 错误 : Module did not self-register.

javascript - Html().replace() : RegExp : $1 and single quote

javascript - 使用bindElement导航到下一页。但是SAPUI5中下一页列表的onAfterRendering方法没有触发