2013-06-04 10 views
6

Nicholas C. Zakas(Wrox、2012、p.210-215)の次の機能を使用したWeb寄稿者のためのプロフェッショナルJavaScript:Web開発者のためのプロフェッショナルJavaScriptの

"寄生虫の組み合わせ継承"
function inheritPrototype(subType, superType) { 
    var prototype = object(superType.prototype); 
    prototype.constructor = subType; 
    subType.prototype = prototype; 
} 

私は何かが欠けていない限り、私は例のコードを使用して取得する出力が同じであるprototype.constructorへのサブタイプの割り当てがないか、行うことになっているかを把握するためには至っていない。

。 inheritPrototypeで "augment object"(prototype.constructor = subType;)を使用しない場合: 0123これは本当に無目的のコードの行を指定できinheritPrototype http://jsfiddle.net/eAYN8/

に;(prototype.constructor =サブタイプ) "オブジェクトを拡張する" と

?説明ありがとうございます!

答えて

3

"constructor"への割り当ては、 "prototype"への割り当てが必須であるため必須ではありません。その理由は、関数プロトタイプは通常、デフォルトで "コンストラクタ"プロパティが設定されているからです。オブジェクト自体からオブジェクトのコンストラクタへの参照を取得できるので、オブジェクトをコピーするライブラリにとっては便利です。

function Foo(){ 
} 

obj = new Foo(); 

console.log(obj.constructor); //function Foo 
+0

をコンストラクタのプロトタイプを上書きする何らかの理由がありますgoog.inheritsにこのパターンを好む? http://docs.closure-library.googlecode.com/git/closure_goog_base.js.source.html#line1466私は親メソッドをオーバーライドして子からそれを呼び出すことができるように、子の 'superClass_'をどのように設定するのが好きです。 – HMR

+0

@HMR:異なる継承パターンは、異なるフィーチャ(複数の継承、プライベート変数や保護された変数、スーパーなどを扱うことができる場合は、「通常の」クラスとやりとりする方法)によってうまく機能する傾向があります。個人的には、私はより機能的なスタイルでプログラムする傾向があるので、実際には多くのクラスを使用しないでください。階層を使用すると、通常は非常にフラットなので、スーパークラスと継承のものはあまり問題になりません。 – hugomg

+0

コンストラクターへの代入が必須ではなく、サブタイプ(または子)インスタンスコンストラクター=== SuperTypeがなく、それをSubTypeにリセットすると、その情報が後で利用可能になるという点でmissingnoとGiviの両方が正しいです。おそらくそれがそこにあるのです。ありがとう! –

2

Demo あなたがSubType.prototype.constructorを失うので、あなたが後でオブジェクトコンストラクタを明示的に設定するべきかを知りたい場合は...

function object(o){ 
    function F(){} 
    F.prototype = o; 
    return new F(); 
} 

function inheritPrototype(subType, superType) { 
    var prototype = object(superType.prototype); 
    prototype.constructor = subType; //if omit (new SubType()).constructor === superType 
    subType.prototype = prototype; 
} 

function SuperType(name){ 
    this.name = name; 
} 

function SubType(name, age){ 
    SuperType.call(this, name); 
    this.age = age; 
} 

inheritPrototype(subType, superType); 
+0

'SuperType'の空のインスタンスをエイリアスする' new F(); 'で作成されたオブジェクトはどこにありますか?それはまだヒープに割り当てられるでしょうか?したがって、私は名前プロパティ 'var sub = new SubType(" Name "、16)にアクセスします。 console.log(sub.name) 'プロトタイプルックアップが行われ、プロトタイプチェーンが上がり、Fのインスタンスもチェーン内にありますか?私が 'sub .__ proto__'とタイプすると、プロトタイプとして' F {} 'ではなく' SubType {} 'が得られます... Fはどこに行きましたか? – tonix

関連する問題