我最近进入ES6并最终认真地看待课程。我读过这些类只是Javascript中Objects的封面,但是,我发现语法最不舒服。
有人可以解释/指出他们解释的参考,类如何模拟&重要的是我们如何在脑海中将它们映射到Javascript的对象操作方式。
class NoteStore {
constructor() {
this.bindActions(NoteActions);
this.notes = [];
}
}
根据上面的示例代码,我认为类只是构造函数,但是构造函数中的构造函数是什么?
作为一个开始用Js学习编程的人,我发现添加类(也是React的类)对Js来说是一个可怕的补充,所以任何帮助都会很棒。
由于
答案 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)
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