2016-04-02 9 views
2

私のJavaScriptコードを構造化するために、私はというES6の新しいプロトタイプ継承用の構文的砂糖を使いたいと思っています。私は問題があります:それは私のプロトタイプのメソッドが期待どおりに動作していないようだ、私はJavaScriptクラスの基本的な誤解、および/または彼らがどのように動作するかもしれないと感じさせる。クラスのプロトタイプが機能しないのはなぜですか?

は、その中に定義されたプロトタイプの方法で伝統的なコンストラクタCatを宣言し、そのプロトタイプを変更し、次のコード、およびES6クラスDogを取ります。

// Traditional Cat Constructor 
// =========================== 
function Cat(name) { 
    this.name = name; 
    this.sound = "Meow."; 
} 

Cat.prototype.speak = function() { 
    console.log(this.sound || "I don't make a sound."); 
}; 


// Dog via ES6 Class 
// ================= 
class Dog { 
    constructor(name) { 
     this.name = name; 
     this.sound = "Woof!"; 
    } 

    speak() { 
     console.log(this.sound); 
    } 
} 

var cat = new Cat("Bella"); 
var dog = new Dog("Sparky"); 

でNodeJS、私はDogのインスタンスのプロトタイプを取得しようとすると、私は空のオブジェクトを取得しますが、私は(4.4.2および6.0.0-前でテスト済み)インスタンス上でプロトタイプメソッドを呼び出せます。

Object.getPrototypeOf(cat); 
// -> Object {} 
// ->  constructor: function Cat(name) 
// ->  speak: function() 
// ->  __proto__: Object 

Object.getPrototypeOf(dog); 
// -> Object {} 
// ->  constructor: function(name) 
// ->  speak: function() 
// ->  __proto__: Object 

Object.getPrototypeOf(cat); 
// -> Cat { speak: [Function] } 

Object.getPrototypeOf(dog); 
// -> Dog {} 

cat.speak(); 
// -> Meow. 

dog.speak(); 
// -> Woof! 

は、私が(ノードがそのエンジンを使用しているため)結果は同じであることを期待 Google Chromeの、で、私の代わりに予想される結果を得ますクラスで定義したプロトタイプメソッドがクラスのインスタンスの関数ではないというNodeのエラーが発生しましたが、これが私がこれに気付いた唯一の理由ですが、残念ながら現在は私はその問題を再現することはできません。

これに関係なく、上記のコードは正しく継ぎ目がありません。このコードがこのように動作する理由は何ですか?

+0

参照[クラスの関数(メソッド)の取得](http://stackoverflow.com/q/31054910/1048572) – Bergi

答えて

7

私のクラスのプロトタイプが機能しないのはなぜですか?

出力が意図したとおりではないということだけが機能していないわけではありません。ノードREPLもconsoleも標準化されていません。実装は、自由に自由に出力することができます。

実際に何か「うまくいく」かどうかを知る唯一の方法は、それを使用することです。だからdog.speak()に電話してみてください。

これに関係なく、上記のコードは正しく継ぎ目がありません。このコードがこのように動作する理由は何ですか?

クラスメソッドは、それゆえ、彼らはノードの出力には表示されません、非可算プロパティです。簡略化された例:

> var foo = {}; 
undefined 
> Object.defineProperty(foo, 'bar', {value: 42, enumerable: false}); 
{} 
> console.log(foo); 
{} 
undefined 
> foo.bar 
42 
> 

Chromeの出力に関しては、オブジェクトを拡張したようです。 Chromeでは、常に列挙可能なプロパティと列挙できないプロパティが表示されます。

> var foo = {}; 
    undefined 
> Object.defineProperty(foo, 'bar', {value: 42, enumerable: false}); 
    Object {bar: 42} 
> console.dir(foo); 
    Object 
    bar: 42 
    __proto__: Object 
    undefined 

また、Chromeは夏には列挙できないプロパティも表示しているようです。しかし、ChromeとNodeが同じエンジンを共有していても、おそらくconsoleや出力生成に同じロジックを共有しているわけではありません。

関連する問題