2016-11-16 9 views
1

私がオンラインで調べるとき、私は別の答えを見つけています。Javascript - クラスのプロトタイプまたはプロパティで定義されたメソッドですか?

class Foo { 
    constructor() { 
     this.data = []; 
    } 

    add(x) { 
     // 
    } 
} 

上記コードはコードAまたはコードBと同等ですか?

コードA:

function Foo() { 
    this.data = [], 
    this.add = function(x) { 
     // 
    } 
} 

コードB:助けを

function Foo() { 
    this.data = [] 
} 

Foo.prototype.add = function(x) { 
    // 
} 

ありがとう!あなたの例では

+1

ここではES6の深いドキュメントを参照してください - https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Classes –

+2

これらはBと同じです。 'console.dir(Foo.prototype)'を見て自分自身で確認してください。 –

+0

関連:[クラスベースおよびオブジェクトベースの言語比較(ECMAScript仕様)](http://stackoverflow.com/q/34010495/218196) –

答えて

2

コードBは、ここでhttps://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Classes

class Animal { 
    speak() { 
    return this; 
    } 
    static eat() { 
    return this; 
    } 
} 

let obj = new Animal(); 
let speak = obj.speak; 
speak(); // undefined 

let eat = Animal.eat; 
eat(); // undefined 

から取られた例は

function Animal() { } 

Animal.prototype.speak = function(){ 
    return this; 
} 

Animal.eat = function() { 
    return this; 
} 

let obj = new Animal(); 
let speak = obj.speak; 
speak(); // global object 

let eat = Animal.eat; 
eat(); // global object 

と同じで、これはES6表記を使用しており、完全の時にサポートされていませんので注意してくださいです書き込み。サポート対象はこちらES6 - https://kangax.github.io/compat-table/es6/

+0

非常に小さくても潜在的に重要なニックピック:ES6のクラス宣言は適切ではありません*吊り上げられていますが、関数(したがって、ES3-5に戻されたクラス宣言)*が吊り上げられます。 – ssube

関連する問題