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、メソッド呼び出しを be on に自動的に転送できます。ClassAこれは のメンバー変数ですClassB

実際のシナリオでは、オブジェクトは brwoser プラグインとして実装され、タグClassAを使用して Web ページに挿入されます。<object>そのメソッドは C++ コードで実装されているため、プロトタイプからそのメソッドを識別してClassB事前に のプロトタイプに挿入する方法はありません。

ClassA のインターフェイスの狭いバージョンで、技術を使用してネイティブ Javascript オブジェクトを作成したいと思います。これを行う方法はありますか?

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

noSunchMethodに関するjfrejのヒントのおかげで、私はそれについてさらに調査を行いましたが、必要なのはHarmonyプロキシ(ここここ)に完全に適合していることがわかりました。そして例はhttp://jsbin.com/ucupe4/edit#sourceで見つけることができます

別の関連記事:http ://dailyjs.com/2010/03/12/nosuchmethod/

于 2012-07-10T02:04:06.200 に答える