3

作为一个显着简化的场景,假设我有 2 个 Javascript 对象,定义如下:

var ClassA = Class.extend({
    'say': function(message) {
        console.log(message);
    }

    ... // some more methods ...
});

var ClassB = Class.extend({
    init: function(obj) {
        this._target = obj;
    }
});

我想在 Javascript 中有某种机制可以使我们执行以下技巧:

var b = new ClassB( new ClassA() );
b.say("hello");

我想找个方法检测是否有方法被调用ClassB,并且方法没有定义在里面ClassB,那么我可以自动把方法调用转发到on ClassA,它是in的成员变量ClassB

在现实世界的场景中,一个对象被实现为 brwoser 插件并使用标签ClassA插入到网页中。<object>它的方法是用 C++ 代码实现的,所以我无法从它的原型中分辨出它的方法,并ClassB事先将它插入到 的原型中。

我想使用该技术来创建一个原生 Javascript 对象,以及 ClassA 界面的窄化版本。有没有办法我可以做到这一点?

4

2 回答 2

3

我认为没有快速的跨浏览器解决方案。

如果你只需要 Firefox,那么使用__noSuchMethod__

请参见此处:is-there-such-a-thing-as-a-catch-all-key-for-a-javascript-object 和此处:javascript-getter-for-all-properties

否则,我会尝试这样的事情:

var b = new ClassB( new ClassA() );

// functionToCall is a string containing the function name
function callOnB(functionToCall) {
    if(typeof b[functionToCall] === function) {
        b[functionToCall]();
    } else {
        b._target[functionToCall](); // otherwise, try calling on A
    }
}

这是使用方括号表示法,其中

b.say('hello')

是相同的

b['say']('hello')

当然,您可能应该扩展它以接受参数:

function callOnB(functionToCall, listOfArguments) {...}
于 2012-07-09T11:58:14.097 回答
0

Thanks to jfrej's hint on noSunchMethod, I did some more research on it and it turns out what I need is quit fit with Harmony Proxies(here and here). And an example can be found at http://jsbin.com/ucupe4/edit#source

Another related post: http://dailyjs.com/2010/03/12/nosuchmethod/

于 2012-07-10T02:04:06.200 回答