javascript - 为什么函数在 JavaScript 中被视为类
问题描述
我在 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());
一切正常,但我不知道为什么。
解决方案
你应该问自己一个问题:什么是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
es 的继承和构造函数。
现在因为这仍然不是很漂亮,所以class
添加了语法,它基本上只是创建了一个带有原型的函数。
推荐阅读
- jquery - jQuery点击显示和切换
- xamarin.ios - iOS 上的本地通知/警报类似于 Android 上的 AlarmManager
- symfony - Symfony,redirectToRoute() 和数据
- r - 如何从非数字变量创建多项式特征?
- python - 使用 pip install pandas 时遇到问题
- java - jquery检查复选框数组中的哪个值被选中
- reactjs - ESlint:当我使用 redux 创建类组件时,组件应该写成纯函数错误
- arduino - ESP8266 使用带有 onSoftAPModeProbeRequestReceived 的 wifimanager
- excel - Excel VBA一次合并多组单元格
- php - 如何计算数据库中的一列,如果为空返回 0 PHP