在Javascript中理解类关键字

时间:2015-12-16 10:46:40

标签: javascript class object constructor ecmascript-6

我最近进入ES6并最终认真地看待课程。我读过这些类只是Javascript中Objects的封面,但是,我发现语法最不舒服。

有人可以解释/指出他们解释的参考,类如何模拟&重要的是我们如何在脑海中将它们映射到Javascript的对象操作方式。

class NoteStore {
  constructor() {
    this.bindActions(NoteActions);

    this.notes = [];
  }
}

根据上面的示例代码,我认为类只是构造函数,但是构造函数中的构造函数是什么?

作为一个开始用Js学习编程的人,我发现添加类(也是React的类)对Js来说是一个可怕的补充,所以任何帮助都会很棒。

由于

3 个答案:

答案 0 :(得分:4)

经典的基于类的编程基于定义一个类,该类包含构造函数方法和其他将由构造对象继承的方法。这是在您的示例中显示的内容:使用其名称定义类,然后包含构造函数,然后是其他函数。

类定义中的构造函数方法有点特殊,因为它在对象构造时被调用。由于它是特殊的,它需要以某种方式标记,并通过命名constructor来完成。

在经典的Javascript(基于原型的OOP)中,它的工作方式不同:对象构造函数是一个简单的函数,每个对象实例继承的方法都是在该函数的.prototype属性上的对象上定义的。基于原型的OOP中的构造函数没有什么特别之处,它只是一个函数,真正的神奇之处在于new关键字以及this时对象的使用得到了建设。

使用构造函数方法以class的形式表达这一点仅仅适用于经典OOP开发人员,并且可以提供更紧凑的语法。

class NoteStore {
  constructor() {
    this.bindActions(NoteActions);
    this.notes = [];
  }

  bindActions(actions) {
    ..
  }
}

这用简单的Javascript表示:

function NoteStore() {
  this.bindActions(NoteActions);
  this.notes = [];
}

NoteStore.prototype.bindActions = function (actions) {
  ..
}

答案 1 :(得分:3)

我认为explanation at MDN非常明确。 class关键字只是旧式OOP实现的新名称,我们使用函数构造函数来获得相同的功能。

class关键字被带到JavaScript,使其更像其他传统的面向对象语言,如C ++,Java。但在核心,它仍然是功能构造函数,几乎没有变化。

对于你的问题"构造函数在构造函数下做了什么" ES6已经对旧版本做了一些修改,因此类不会作为examaple类的构造函数,不能直接调用(没有new关键字),如

NoteStore();

这将在ES6中引发错误,但如果它是一个像ES5中的函数构造函数,那么它会让你冒着错误的风险。课程也没有悬挂。

有关详细信息和示例,请参阅this link

答案 2 :(得分:0)

JS class关键字:

JavaScript有一个继承系统,称为原型继承。这是一个对象从其他对象继承属性的系统。使用关键字new调用函数时,使用其创建的新对象会从构造函数的 prototype 属性中“继承”属性。

JS class关键字仅仅是构造函数的语法糖。 class关键字仅具有不同的语法,但实际上实现了使用原型创建对象的相同目标。以下面的代码段为例:

class human {

  constructor (name) {
    this.name = name;
  }

  speak () { console.log('hi')}

};

console.log(typeof human); 
// logs function, a class is just a constructor function under the hood

const me = new human('Willem');

console.log(Object.getPrototypeOf(me) === human.prototype); 
// logs true, the object me has a reference to the human.prototype object.

me.speak(); 
// This speak method is located on the prototype of the object, not the object itself

console.log(me.hasOwnProperty('speak')); // logs false
console.log(human.prototype.hasOwnProperty('speak')); // logs true