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

相關問題