2011-12-16 2 views
9

この 'Controller'オブジェクトのコンストラクタを猿のパッチにしたいと思います。しかし、私はどのように私は元の呼び出しを呼び出すことができますので、私は猿のコンストラクタ機能をパッチするのですか?これが私が試したことです。どのようにオブジェクトのコンストラクタ関数をサルにパッチしますか?

// original 
function Controller() { 
    this._tag = 'div'; 
} 
Controller.prototype.tag = function() { 
    console.log(this._tag); 
} 

var c = new Controller(); 
c.tag(); // -> 'div', as expected 


// patch attempt 
var original = Controller; 
Controller = function() { 
    original.apply(this); 
    this._tag = 'patched'; // patch 
} 

var c = new Controller(); 
c.tag(); // no method tag, prototype appears wiped... 
+0

RHS関数式の回りのグループ化演算子は余分です。 "コンストラクター"は別の関数の中で宣言されているので、外部からアクセスすることはできません(欠けているコードが外部の無名関数やその他のオブジェクトのプロパティにならない限り)。ですから、コンストラクタを "猿パッチ"にしたい場合は、コメントがある場所にコードを挿入することが唯一の方法です。 – RobG

+0

@RobG好奇心の場合:http://en.wikipedia.org/wiki/Monkey_patch猿にかなり簡単にプロパティやメソッドをパッチしますが、コンストラクタ関数の特別な状態のために私は迷っています。あなたはこれが不可能であることは間違いないかもしれませんが、あなたがまだ述べている理由についてはわかりません。私はコードサンプルを反映するように更新します。 –

+0

はより良いコードサンプルを追加しました。 –

答えて

8

でオブジェクトの構築を検討することができます

function Constructor(){ 
    this.init(); 
} 
Constructor.prototype.init = function(){ /*...*/ }; 

必要に応じてoldTagに電話をかけることができます(または元に戻すこともできます)。

var oldConstructor = Constructor; 

var Constructor = function() { /* new constructor */ }; 
Constructor.prototype = oldConstructor.prototype; 

だから今、あなたはすべての古いメソッドを使用して新しいコンストラクタを持っている:

かは、おそらくあなたのような何かをしたいです。または上記の両方を実行します。あなたがしたいことを言うために単純な英語を使用してください。

+0

ありがとうございます。これまでのところ、私がしようとしていることは不可能だと思われます。 –

2

クリーンな方法は、コンストラクタにパッチを適用サルではありません:/別のinit方法とサルのパッチでコンストラクタロジックを置く代わりに、それを継承します。今、すべてのインスタンスが新しいタグ方法を得る

Constructor.prototype.oldTag = Constructor.prototype.tag; 

Constructor.prototype.tag = function() {/* whatever */}; 

:あなたはまた、あなたが好きな何かをしたいように見えるビルダー機能

function make_fancy_obj(){ 
    var obj = new Constructor(); 
    obj.foo = 'bar'; 
    return obj; 
} 
+0

私はスペルertorを修正し、funcitonは関数になりました。私を気にしないでください。 – MrBoJangles

+1

@MrBoJangles:最終的に宇宙を支配するとき、私は物理学の法則を変更して、すべての関数を関数で置き換えます。その後、私のすべての問題は解決されます – hugomg

+2

私は残念なことに、元のコンストラクタへのアクセス権を持っていません。だから私はこの道を行く。私の例でオリジナルを変更せずにこれを行うことはできますか? –

関連する問題