2017-01-26 10 views
2

es6クラス構文で作成されたパブリックメソッドは、列挙できません。 es5 & es6で書かれた 'getname'メソッドの違いは何ですか?es6 propertyIsEnumerable

function Cat(){ 
this.name="cat" 
} 
Cat.prototype.getname = function() {return this.name} 
var cat = new Cat() 

class Dog { 
constructor(){ 
    this.name="dog" 
} 
getname() { 
    return this.name 
} 
} 
var dog = new Dog() 

cat.__proto__.propertyIsEnumerable("getname") //true 
dog.__proto__.propertyIsEnumerable("getname") //false 

答えて

4

オブジェクトに直接プロパティを追加すると、obj.property = fooは常に列挙可能なプロパティを作成します。

ES2015のクラス構文ではこれを行いません。 (部分的に)あなたが言うように、ES6クラスのメソッドが列挙されないObject.defineProperty(Cat.prototype, 'getname', ...)

+0

ES2015の動作が異なる理由はありますか?クラス構文が文法的な砂糖だけの場合、__proto__で連鎖されたメソッドを列挙できないはずですか? – Viswesh

+0

プロトタイプチェーンを定義するための構文砂糖ですが、 'Object.defineProperty'を使用したければES5で列挙できないようにすることもできました。 – loganfsmyth

+0

申し訳ありませんが、それは答えの批判ではなく、Visweshに対する返信を意味していました。 – loganfsmyth

4

使用getnameメソッドを追加する必要があると思いますES5でES2015の機能を複製する

。もう一つの違いは、彼らが構築可能ではないということです。

new cat.__proto__.getname; // works 
new dog.__proto__.getname; // throws a TypeError 

はまた、クラスのメソッドのコードは常にstrict modeコードで、superキーワードなどの特定の言語機能を利用することができます。

+0

また、 'super'と' new'の制限がオブジェクトメソッドにも当てはまることを明確にするのには良いです:) – loganfsmyth