如果方法不存在,请创建一个方法

时间:2014-05-01 22:34:29

标签: javascript

我正在尝试模拟一个在JSBin中有许多方法的对象。我不想重新定义整个方法是JSBin。主要是因为方法经常被添加,我只是试图探索我想要的是否可能。有没有办法可以创建一个对象,这样无论调用什么方法,它都会返回一个任意值?

var ret = {

  //no methods

};

var result = ret.getSomeVal("funny_cat.gif");

console.log(result); //funny_cat.gif

是否可以拦截对ret的此调用并自动创建returnSomeVal方法,以便它只返回传递给它的任何参数?

2 个答案:

答案 0 :(得分:1)

在Ruby中,此功能称为method_missing。无论何时调用尚未在对象上定义的方法,都会调用此方法。

从那时起,你可以做任何你想做的事情,比如给自己发一封电子邮件,通知你有些用户试图调用未定义的方法,甚至让method_missing在这些情况下返回一些默认响应。 / p>

我发现此method_missing的端口为javascript。它看起来像你想要的:

https://github.com/nakajima/method-missing-js

答案 1 :(得分:1)

Proxies旨在允许像这样的所有人。

  

代理是程序员必须在JavaScript中定义语义的对象。

因此,您可以重新定义obj[...]以返回未定义属性的默认值,而不是undefined。它们是EcmaScript.next的计划API,所以虽然很多浏览器在规范定稿时已经实现了它们,但尚未标准化。

simple example为任何

返回37
var handler = {
    get: function(target, name){
        return name in target?
            target[name] :
            37;
    }
};

var p = new Proxy({}, handler);

您可以修改此项以返回方法。

function returns_37() { return 37; }

var handler = {
    get: function(target, name){
        return name in target?
            target[name] :
            returns_37;
    }
};

var p = new Proxy({}, handler);