首页 > 解决方案 > 为什么函数在 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());

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

标签: javascriptecmascript-6arrow-functions

解决方案


你应该问自己一个问题:什么是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();

你去了,没有任何classes 的继承和构造函数。

现在因为这仍然不是很漂亮,所以class添加了语法,它基本上只是创建了一个带有原型的函数。


推荐阅读