Резюме
В ES6
введено ключевое слово class
. Ключевое слово class
является не более чем синтаксическим сахаром поверх уже существующего шаблона наследования прототипа. Классы в javascript - это в основном еще один способ написания функций конструктора, которые можно использовать для создания нового объекта с помощью ключевого слова new
.
Пример
class Person {
constructor(name) {
this.name = name;
}
talk() { console.log('hi'); }
}
const me = new Person('Willem');
console.log(typeof Person)
// logs function, Person class is just another constructor function under the hood
console.log(me.__proto__ === Person.prototype)
// logs true, classes just use the same prototypal inheritance pattern which is used by constructor functions.
// An object created with the new keyword gets a __proto__ property on it which is a reference to the prototype property on a constructor function.
В приведенном выше примере в первом журнале видно, что классы, создаваемые из ключевого слова class
, на самом деле являются скрытыми функциями.
console.log(typeof Person) // logs 'function'
es6
классы используют тот же шаблон наследования прототипа, который используется функциями конструктора. Вот еще один пример, демонстрирующий это поведение:
class Dog {
constructor (name) {
this.name = name;
}
bark () { console.log('bark') };
}
let doggie = new Dog('fluffy');
doggie.bark(); // logs bark
Dog.prototype.bark = () => console.log('woof');
// changing the prototype of Dog, doggie refers to this with its __proto__ property.
//Therefore doggie bark method has also changed.
doggie.bark(); // logs woof
Вывод в приведенном выше примере заключается в том, что метод лая любого экземпляра собаки может быть изменен во время выполнения. Это потому, что метод bark любого объекта, созданного с помощью класса Dog, просто ссылается на эту функцию.