2017-07-18 14 views
0

私はJavascriptとNode.jsが新しく、ECMAScript 6に従っていますが、コンストラクタメソッドでプロパティ定義を取得できません。それは古い書き込みスタイルで参照することができながら:コードの書き込み時にコンストラクタメソッドで定義されたプロパティを取得できませんECMAScript 6

'use strict' 

function Animal (name) { 
    this.name = name 
} 

// Animal.prototype.walk = (destination) => { 
//  console.log(this.name + " walk to " + destination) //undefined walk to China 
// } 

Animal.prototype.walk = function (destination) { 
    console.log(this.name + " walk to " + destination) //Cat walk to China 
} 

const cat = new Animal("Cat") 
cat.walk('China') 

I want to know the reason, thanks! 
+1

矢印以外の機能は「古いスタイル」ではありません。彼らは異なったスタイルであり、異なる 'この'ルールを持っています。プロトタイプに物を添付したい場合は、関数式の使用を続けます。 'class'もES6に存在します。 – Ryan

答えて

2

[...]コードを記述しようとしていますのECMAScript 6従うが、私はそれができる一方、プロパティは、コンストラクタメソッドで定義することができません古い書き込みスタイルで参照されています

どちらの場合でも問題を解決する "コンストラクタ"ではなく、インスタンス上にnameプロパティを定義します。

nameには、コメント付きとコメントなしの両方の方法でアクセスする方法があります。walk()メソッドです。

矢印機能()=>function(){}の近道ではない、それがfunctionに環境の参照contextを定義避けるために生まれました。上記のあなたの例では

、私はES5でそれを説明します

'use strict' 

function Animal (name) { 
    this.name = name 
} 


Animal.prototype.walk = (destination) => { 
    console.log(this.name + " walk to " + destination) //undefined walk to China 
} 

//the above ES6 will be transform to ES5 like this: 
var self = this; //reference `this` - the environment context into variable `self`. 
Animal.prototype.walk = function(destination) { 
    console.log(self.name + " walk to " + destination); 
} 


const cat = new Animal("Cat") 
cat.walk('China'); // undefined walk to China. 

私は上記の例に続いて、あなたは正確に何thisがあることを学ぶことができると思います。したがって、arrow functionを「応答して」使用してください。

+0

私はスコープとコンテキストについての記事を書いて、それが助けてくれることを願っています:) https://kaiz.space/scope-and-cotext/ – Kai

+0

私の答えを更新するために@ try-catch-finallyに感謝します:) – Kai

関連する問題