javascript - 为什么 JavaScript 中函数被视为类

标签 javascript ecmascript-6 arrow-functions

我正在学习 Treehouse 的“ES2015 简介”类(class),老师展示了这段代码来说明箭头函数,但在这里他将该函数实例化为一个类。谁能告诉我这怎么可能?

我对对象的了解是,您需要在实例化它之前创建一个类或创建一个文字对象,但本例并非如此。

'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 已经有一个很棒的功能来实现这一点:原型(prototype)继承。对象可以继承其他对象,包括方法:

  const proto = { method() { /*...*/ } };

  const instance = Object.create(proto);
  instance.method(); // that works, as instance inherits proto

现在我们只需要构造函数,因为我们可以在使用上面的方法创建对象后调用一个函数:

   constructInstance(Object.create(proto));

现在,由于这是一项非常常见的任务(因为 JS 从一开始就具有原型(prototype)继承),因此添加了 new 运算符,它基本上完成了所有这些工作:

1) 它创建一个继承自所调用函数的 .prototype 的空对象。

2) 它以 this 为对象来调用函数本身。

3)它返回该对象。

   function Person(name) {
     this.name = name;
   }

   Person.prototype.method = function() { /*...*/ };

  new Person("Jonas").method();

就这样,继承和构造函数没有任何es。

现在,由于这仍然不太漂亮,所以添加了 class 语法,它基本上只是创建一个带有原型(prototype)的函数。

关于javascript - 为什么 JavaScript 中函数被视为类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55925090/

相关文章:

javascript - 使用正则表达式允许文本字段中的某些字符

javascript - console.log 在箭头函数中不起作用

CodeWars 上的 javascript 挑战 : what's wrong with my solution?

javascript - Jquery 预选插件中的下拉菜单选项

javascript - 如何检查网站是否通过 http 或 https(协议(protocol))运行

javascript - 我可以将参数传递给 ES6 生成器函数吗

javascript - React-自动建议和 ES5

angular - 箭头函数隐式返回自动用括号包裹

javascript - 在 Chrome 中支持 clientWidth/height

javascript - ES6 - 可以从对象解构为另一个对象属性吗?