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

相关问题