Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Delegate Javascript Functions

Tags:

javascript

As an siginificantly simplified scenario, say I have 2 Javascript objects defined as below:

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

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

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

I'd suppose that in Javascript there is some kind of mechanism could enable us to do the following trick:

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

I'd like to find a way to detect if there is a method called upon ClassB, and the method is not defined in ClassB, then I can automatically forward the method call to be upon ClassA, which is a member variable in ClassB.

In a realworld scenario, ClassA is an object implemented as brwoser plugin and inserted into the webpage using <object> tag. It's method is implemented in C++ code so there is no way I can tell its methods from its prototype and insert it to ClassB's prototype beforehand.

I'd like to use the technical to create a native Javascript object, with a narraw-ed version of ClassA's interface. Is there a way I can do this?

like image 879
Jay Zhu Avatar asked Oct 30 '25 16:10

Jay Zhu


2 Answers

I don't think there is a quick cross-browser solution to this.

If you only need Firefox, then use __noSuchMethod__

See here: is-there-such-a-thing-as-a-catch-all-key-for-a-javascript-object and here: javascript-getter-for-all-properties

Otherwise, I would try something like this:

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
    }
}

This is using the Square Bracket Notation where

b.say('hello')

is the same as

b['say']('hello')

Of course, you should probably expand this to take arguments in:

function callOnB(functionToCall, listOfArguments) {...}
like image 53
jfrej Avatar answered Nov 01 '25 07:11

jfrej


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/

like image 39
Jay Zhu Avatar answered Nov 01 '25 05:11

Jay Zhu



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!