我在Treehouse的“ ES2015入门”课程中,老师显示了此代码来说明箭头功能,但在这里他将其实例化为类。谁能告诉我这怎么可能?
我了解到的对象是,您需要先创建一个类,然后再实例化它或创建不是这种情况的文字对象。
'use strict';
var Person = function(data) {
for (var key in data) {
this[key] = data[key];
}
this.getKeys = () => {
return Object.keys(this);
}
}
var Alena = new Person({ name: 'Alena', role: 'Teacher' });
console.log('Alena\s Keys: ', Alena.getKeys()); // 'this' refers to 'Alena'
var getKeys = Alena.getKeys;
console.log(getKeys());
一切正常,但我不知道为什么。
答案 0 :(得分:2)
您应该问自己一个问题:class
到底是什么?
实际上,构成以下内容只是一种语法:
1)一个constructor
。这是某种功能,可构造类的实例。
2)方法。可以将它们称为 实例。
现在,第二个方面,JS已经具有实现此目的的强大功能:原型继承。对象可以继承其他对象,包括方法:
const proto = { method() { /*...*/ } };
const instance = Object.create(proto);
instance.method(); // that works, as instance inherits proto
现在我们只需要构造函数,为此,我们可以在使用上述方法创建对象之后调用函数:
constructInstance(Object.create(proto));
现在由于这是一项非常常见的任务(因为JS从一开始就具有原型继承性),所以添加了new
运算符,该运算符基本上可以完成所有操作:
1)它创建了一个空对象,该对象继承自调用的函数的.prototype
。
2)它以this
作为对象来调用函数本身。
3)它返回该对象。
function Person(name) {
this.name = name;
}
Person.prototype.method = function() { /*...*/ };
new Person("Jonas").method();
然后就可以了,没有任何class
的继承和构造函数。
现在,由于它仍然不是很漂亮,所以添加了class
语法,它基本上只是创建带有原型的函数。