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

为什么函数在JavaScript中被视为类,javascript,ecmascript-6,arrow-functions,Javascript,Ecmascript 6,Arrow Functions,我正在学习Treehouse的“介绍ES2015”课程,老师展示了这段代码来说明箭头函数,但在这里他将函数实例化为一个类。谁能告诉我怎么可能 我对对象的了解是,在实例化类或创建文本对象之前,需要先创建一个类,但实际情况并非如此 'use strict'; var Person = function(data) { for (var key in data) { this[key] = data[key]; } this.getKeys = () =>

我正在学习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) 一个
构造函数
。这是一种函数,用于构造类的实例

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();
接下来就是继承和构造函数,没有任何


现在,这还不是很漂亮,添加了
语法,基本上只是创建了一个带有原型的函数。

如果我说
只是创建了一个函数。。。那我就更让你困惑了,对吧您可能需要阅读一篇全面的解释,了解jsp中真正的函数是什么,以及@jonaswillms所说的是什么,它的
Class
在javascript中并不存在。ES中的
class Person{}
将是你老师写的:)我没有资格给出正确的答案,但它基本上是JavaScript实现面向对象编程的组合(它是基于原型的语言,而不是基于类的语言),函数是JavaScript中的对象这一事实以及创建该语言的人的语法选择。IMHO不是学习OOP最直观的语言。