【问题标题】:Why a function is treated as a class in JavaScript为什么函数在 JavaScript 中被视为类
【发布时间】:2019-09-19 08:39:27
【问题描述】:

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

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

【问题讨论】:

标签: javascript ecmascript-6 arrow-functions


【解决方案1】:

您应该问自己一个问题: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 语法,它基本上只是创建一个带有原型的函数。

【讨论】:

    猜你喜欢
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多