0

コンストラクター内にある関数を編集する必要があります。例:

some.thing = function() {
    this.somefn = function() { // this is the function that I need to fix
        ...
    }
}

ただし、関数は、単一のオブジェクト ( new obj = some.thing();) だけでなく、このコンストラクターによって作成されたオブジェクトに対しても編集する必要があります。

そのような内部関数を編集する方法はありますか?

4

3 に答える 3

2

解決策は少し明白すぎるように思えるので、問題は元のコードにアクセスできないことであり、より動的な解決策が必要なのだろうかと思います。

その場合、コンストラクターを独自のコンストラクターでオーバーライドし、元のコンストラクターを呼び出してから、オブジェクトを更新するという1 つのオプションがあります。


元のコード:

some.thing = function() {
    this.somefn = function() { // this is the function that I need to fix
        ...
    }
}

あなたのコード:

       // cache a reference to the original constructor
var _thing = some.thing;

               // your constructor
some.thing = function() {

             // invoke the original constructor on the new object.
    _thing.apply(this, arguments);

    this.somefn = function() { /*your updated function*/ };
};

        // maintain inheritance
some.thing.prototype = Object.create(some.thing.prototype);

  // make an instance
var theThing = new some.thing();

これで、元のコンストラクターとプロトタイプ チェーンの利点が得られますが、作成されるオブジェクトに独自の関数を挿入することになります。

唯一の問題は、置き換えた元の関数が元のコンストラクターの変数スコープを特別に使用できることです。その場合、解決すべき問題が発生します。

自分のメソッドを呼び出す前に上書きした元のメソッドを保持して呼び出すことができます。この状況がそれを必要とするかどうかはわかりません。

于 2012-10-10T18:56:45.403 に答える
2

プロトタイプに基づくソリューションは次のとおりです。

var Something = function () {
    this.f = function () {
       console.log("Something");
    };    
};
var Old = Something;
var Something = function () {
    Old.apply(this);
    this.f = function () {
        console.log("New");
    };
};
Something.prototype = new Old();

var s = new Something();
s.f(); // prints "New"
于 2012-10-10T19:06:40.923 に答える
0

私は先週私がそれを通過したあなたの必要性の原因を正確に知っています. javascript で完全な継承モデルを実装したばかりですが、私が覚えている限りでは、子クラスの初期化時にコンストラクターをオーバーライドして親クラスの ctor を呼び出すことに問題がありました。

それで、デザインのいくつかのポイントを変更することで問題を解決したところ、今では魅力的に機能しています! (C# のようなものですが、Javascript で)

ところで、メソッドの内容をこのように変更することはお勧めしませんが、ここにその方法を示します (私自身はこの方法を行っていません。これが最も簡単です):

var test = function() { /*InjectionPlace*/ };

eval("var newTest = " + test.toString().replace(
     "/*InjectionPlace*/", 
     "var i = 10; alert(i);"
));

test();

newTest();

乾杯

于 2012-10-10T19:01:00.773 に答える