2016-11-16 3 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

Очень маленькая, но потенциально важная nitpick: объявления классов в собственно ES6 являются * not * но функции (и, следовательно, декларации классов, которые были переведены обратно на ES3-5) *, были подняты. – ssube