5

親から継承するプロパティを取得しようとしていますが、正しい方法は不明です。JSのプロトタイプ継承と親プロパティを取得する方法

は私が持っているとしましょう:

var Animal = function(name){ 
    this.offspring = []; 
    this.name = name; 
    return this; 
} 

Animal.prototype.createOffspring = function(name){ 
    name = name || 'Baby '+(this.offspring.length+1); 
    this.offspring.push(name); 
    return this; 
} 

今、私はそう、私は手動で親からすべてを追加する必要はありませんサブプロトタイプの継承を追加したいです。例えば、私はそれを手動で猫にnamecreateOffspringを追加することなくAnimal

var pet = new Cat('Kitty'); 
pet.createOffspring(); 

であるかのように私は、これを行うにはしたいと思いAnimal

からベースCatを追加したいと言うことができますconstructor実際にはAnimalですが、他の機能が追加されています(.meow()など)。

答えて

4
// Parent 
function Animal() { 
    this.name = 'An animal'; 
} 

// Some child 
function Cat() { 
    this.speaks = 'Meow'; 
} 
// Here comes inheritence 
Cat.prototype = new Animal(); 
// Or like that 
// but don't forget to put all inheritable fields to Animal's prototype 
Cat.prototype = Object.create(Animal.prototype); 

// Let 'instanceof' work. Don't forget the following line, 
// because we eraese the info about constructor of Cat instances. 
Cat.prototype.constructor = Cat; 
// Add some custom method 
Cat.prototype.meow = function() { return this.speaks; } 

var cat = new Cat(); 
var animal = new Animal(); 

/// Some tests 
cat.name; // A animal 
animal.name; // An animal 
cat.meow(); // Meow! 
cat instanceof Cat; // true 
cat instanceof Animal; // true 

これはそれですか? (UPD:固定プロトタイプを持つエラー) (UPD2:。申し訳ありませんがそれは夜遅くで、私は多くのミスをする..私は睡眠を行かなければならない)


あり、別の解決策でもあるが、そのクロム、 FF-特定の(おそらく他の人):

// Animal and Cat functions from above, but 
Cat.prototype = { 
    __proto__: Animal.prototype, 
    constructor: Cat, 
    meow: function() { ... } 
} 

が短く見えるが、これによって誘惑さnot'd:それはのECMAScriptスタンダールに従う方が良いでしょう。

+0

私はそれをテストする必要がありますが、_all_ animalsには名前があるので、 'this.name = 'A cat';'を削除できなければならないので、 'this.name'をやり直す必要はありません'cat.name'は' Animal'を返します。 –

+0

ああ、すみません。私は間違った答えにあなたを誤解します:Animal.prototypeは設定されていないので、 'cat.name'は例外を与えます。インスタンスが動力学的に構築されるとき、正しい方法は、オブジェクトにプロトタイプを割り当てることです: 'Cat.prototype = Object.create(new Animal())' –

+0

これは正しい方向に私を得てくれてありがとう。申し訳ありませんが、それほど時間がかかりました:) 奇妙なことは、 'Cat.prototype.constructor = Cat;'がコード内にあるかどうかが同じで、 'instanceof' s。また 'Object.create()'行は 'cat.name'を未定義にします。 http://jsbin.com/uhogig/edit#javascript,html –

0

JavaScriptで説明しているように、継承を実装するためのさまざまなパターンがあり、プロトタイプオブジェクトを扱う方法には微妙な違いがあります。

ここには、prototype patternconstructor patternに関する2つの参考文献があります。

あなたが説明した内容のsimple implementationです。

関連する問題