2016-10-29 2 views
0

はJavaScriptでinheritnaceと完全に混乱を理解しようと変数に割り当てられたjavascriptの匿名関数を継承する方法は?

私はちょうどDogCatがbarkmeow機能を持っていることを必要と継承チェーン内の各オブジェクトのthis(何とか)にアクセスすることができ:

var cat = function() { this.name = "tom"; this.cat_instance = this; } 
    var dog = function() { this.name = "bob"; this.dog_instance = this; console.log("cat is here!");} 

    cat.prototype.meow = function() { console.log("mhew"); } 
    dog.prototype.bark = function() { console.log("whoof"); } 

    var DogCat = function() { 
     DogCat.prototype = dog.prototype; 
     DogCat.constructor = cat; 
     console.log("my name is " + this.dog_instance + " " + this.cat_instance); 
    } 

のでDogCat.prototype現在dogプロトタイプを指していて、DogCatのインスタンスを指しています。少なくともbarkの機能を取得できますが、インスタンスにはこの機能がありません。 、そして、

var DogCat = function() { 
     cat.apply(this); 
     dog.apply(this); 
     console.log("my name is " + this.dog_instance + " " + this.cat_instance); 
    } 

犬にプロトタイプを指す:今

DogCat.prototype = dog.prototype; 
    var d = new DogCat(); 
    > cat is here! 
    >my name is [object Object] [object Object] 

オーケー

は、私が子供の両方に継承されたコンストラクタを適用し、今しようと思います(私の心の中で)混乱のthats私はbarkにアクセスできますが、meowの処理方法は?プロトタイプチェーンを正しく構築するには?

+1

プロトタイプの最初のルールは[コンストラクタ内で決して割り当てない]です(http://stackoverflow.com/q/21296559/1048572)。 JSプロトタイプの第2のルールは、「多重継承」(https://en.wikipedia.org/wiki/Multiple_inheritance)はありません。ごめんなさい。 – Bergi

+0

これをクリアしていただきありがとうございます!複雑なアプリケーションを構築し、コードの重複を避ける方法を避ける方法は? 'DogCat.prototype.meow = cat.prototype.meow;'のようなプロトタイププロパティを再割り当てするだけです。 –

+0

はい、単なる継承よりもコードの重複を避けるために、さらに多くのパターンがあります。あなたの状況に最も適したものはどれですか?実際のコードを表示すると、何かを提案することができます。 – Bergi

答えて

2

を固定

UPD

DogCatで申し訳ありませんがあるはずDogCat.prototype = dog.prototypeは、あなたは正しい軌道に乗って、ほとんどですが、いくつかのミスを持っています。

プロトタイプをコンストラクタ内に割り当てるため、オブジェクトが作成された後にプロトタイプが割り当てられるため、最初のコードは機能しません。最初に作成されたオブジェクトにはプロトタイプメソッドはありませんが、2番目のメソッドは作成されます。また、あなたはすでにconstructorの割り当てが気にならないことに気付きました。手動でコンストラクタを適用する必要があります。

var DogCat = function() { 
    cat.apply(this); 
    dog.apply(this); 
    console.log("my name is " + this.dog_instance + " " + this.cat_instance); 
    } 
DogCat.prototype = dog.prototype; 

プロトタイプも通常のオブジェクトです。魔法の特性はありません。 2つのプロトタイプを割り当てて魔法のように動作させることはできません。 2つの基本クラスから継承したい場合は、便宜のためにinherit関数を記述することができます。

function copyPrototypeMethods(myClass,base){ 
    for(var prop in base.prototype){ 
     myClass.prototype[prop] = base.prototype[prop]; 
    } 
} 

// Use it like: 
copyPrototypeMethods(DogCat, dog); 
copyPrototypeMethods(DogCat, cat); 

継承していることが分かっている場合は、基本的なクラスから必要なすべてのメソッドを手動で割り当てます。

DogCat.prototype.bark = dog.prototype.bark; 
DogCat.prototype.meow = cat.prototype.meow; 
+2

その名前を 'inheritFrom'にするべきではありません。代わりに、 'copyPrototypeMethods'が適切です。 "継承"という用語は、 'd = new DogCat')' d instanceof Dog'と 'd instanceof Cat'が動作することを意味します。 – Bergi

関連する問題