2012-11-14 11 views
6

私は、以下に示すように、私はcan overwrite a methodがJavascriptクラスであることを知りましたが、実際のコンストラクタはどうですか?javascriptでコンストラクタを上書きすることはできますか?

可能であれば、クラスをインスタンス化せずにどうやって行うのですか?

var UserModel = (function() { 
    var User; 
    User = function() {}; // <- I want to overwrite this whilst keeping below methods 
    User.prototype.isValid = function() {}; 
    return User; 
})(); 

答えて

9

ただ、一時的にprototypeオブジェクトを保存して、コンストラクタ関数を置き換える:

var proto = UserModel.prototype; 
UserModel = function() { /* new implementation */ }; 
UserModel.prototype = proto; 
+0

とてもきれいです!ありがとうございました! – Industrial

+0

スコープにアクセスできない場合は、コンストラクタを上書きすることはできません。ユースケースとは何ですか? –

+0

@MaëlNison私はOPがコンストラクタを後で上書きしたいと思う。 –

0

基本的に、あなたは何もしない一時的な関数を作成し、あなたはそのプロトタイプは、親クラスのプロトタイプを持っている設定そのコンストラクタを呼び出さずに、親クラスとして基本クラスを使用することができます。

子クラスのコンストラクタから親クラスのコンストラクタを参照する必要がある場合は、Function.prototype.applyを使用してコンストラクタ呼び出しを転送する必要があります。

JavaScriptの継承モデル:

// Base class 

var Base = function () { 
    this.foo = 40; 
}; 

Base.prototype.bar = function () { 
    return this.foo; 
}; 

// Inherited class 

var Child = function () { 
    Base.apply(this, arguments); 
    this.foo += 2; 
}; 

var F = function () { }; 
F.prototype = Base.prototype; 
Child.prototype = new F(); 
+0

なぜChild.prototype = new F(); Child.prototype = Base.prototypeではありません。 ? – Naor

+0

@ Naorプロトタイプを親のプロトタイプとして設定した場合、新しいメソッドを子のプロトタイプに追加すると、そのプロトタイプも親に追加されるためです。子プロトタイプの親メソッドを上書きすると、親オブジェクトも同じオブジェクトであるため、親のメソッドも上書きされます。 'new'を使用する点は、元のプロトタイプに変更を加えることなく編集できる新しいインスタンスを作成することです。 –

関連する問題