Почему функция рассматривается как класс в JavaScript - PullRequest
2 голосов
/ 30 апреля 2019

Я нахожусь на курсе «Представляем ES2015» в Treehouse, и учитель показывает этот код для иллюстрации функций стрелок, но здесь он создает функцию как класс. Кто-нибудь может сказать мне, как это возможно?

Что я узнал об объектах, так это то, что вам нужно создать класс, прежде чем создавать его экземпляр, или создать буквальный объект, который не соответствует этому случаю.

'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 голосов
/ 30 апреля 2019

Вы должны задать себе один вопрос: что такое class на самом деле?

На самом деле это всего лишь синтаксис для составления следующих вещей:

1) A 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 es.

Теперь, когда это все еще не так красиво, был добавлен синтаксис class, который просто создает функцию с прототипом.

...