2017-01-15 9 views
2

I 2つのバージョンコードJavaScriptのプロトタイプObject.create

let Animal = function() 
    { 

    } 

    Animal.prototype.voice = "Miau" 


    let Cat = function() 
    { 

    } 
    Cat.prototype = Object.create(Animal.prototype); 

    let flippy = new Cat(); 

    console.log(flippy.voice) 

このバージョンはvorkedと "Miau" を返してきたが、第2版

let Animal = function() 
{ 
    this.voice = "Miau" 
} 


let Cat = function() 
{ 

} 
Cat.prototype = Object.create(Animal.prototype); 

let flippy = new Cat(); 

console.log(flippy.voice) 

が働いたが、私はflippy.voiceを呼び出すカントはなぜfalseを返しますか?どのようにして電話がうまくいくの?

答えて

4

なぜflippy.voiceに電話できませんか?

には、コードがこれまでに実行されていないので、それを作成しているであろうと、flippyにはvoiceはありませんので。

JavaScriptでコンストラクタを導出するとき、それはサブのコンストラクタからスーパーのコンストラクタを呼び出すことが重要です。

let Cat = function() { 
    Animal.call(this); // <==== 
}; 

あなたがそれを行う場合は、Animalでコードが実行され、インスタンスがvoice性質を持っています。

注:それはCat.prototypeconstructorプロパティを修正するためにも便利です。

let Cat.prototype = Object.create(Animal.prototype); 
Cat.prototype.constructor = Cat; // <=== 

Animal"Miau"voiceを設定したことは...間違っているようだ、と述べました。おそらく引数としてそれを受け入れる?もちろん

let Animal = function(voice) { 
    this.voice = voice; 
}; 

let Cat = function() { 
    Animal.call(this, "Miau"); 
}; 

let Cat.prototype = Object.create(Animal.prototype); 
Cat.prototype.constructor = Cat; 

let flippy = new Cat(); 
console.log(flippy.voice); // "Miau" 

、ここでは2017年、あなたは簡単にするためにclass構文(必要に応じて古いターゲット環境のためtranspiling)を使用することができます。

class Animal { 
    constructor(voice) { 
     this.voice = voice; 
    } 
} 

class Cat extends Animal { 
    constructor() { 
     super("Miau"); 
    } 
} 

let flippy = new Cat(); 
console.log(flippy.voice); // "Miau" 
+0

私はObject.create(機能を拡張すると思います。プロトタイプ)同じもの –

+0

@MuradSofiyev:何と同じもの? 'Cat'から' Animal'を呼び出すのと同じことではなく、 'constructor'を正しい値に設定しません。 –

関連する問題