为什么在JavaScript中将函数视为类

时间:2019-04-30 16:20:36

标签: javascript ecmascript-6 arrow-functions

我在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());

一切正常,但我不知道为什么。

1 个答案:

答案 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语法,它基本上只是创建带有原型的函数。

相关问题