Я пытаюсь понять разницу между 3 следующими функциями. Я сделал несколько «выводов» после дня, посвященного MDN и другим источникам, и мне было интересно, может ли кто-нибудь помочь мне подтвердить их. Спасибо :)
BLOCK # 1 (пример функции конструктора на основе прототипа)
function Person (name){
this.name = name;
this.greeting = function(){
alert(this.name);
};
}
var person = new Person('Bob');
BLOCK # 2 (другой пример функции конструктора на основе прототипа)
function Person(name) {
this.name = name;
}
Person.prototype.greeting = function() {
alert(this.name);
}
let person = new Person("Bob");
BLOCK # 3 (пример класса ES6 на основе прототипа)
class Person {
constructor(name) {
this.name = name;
}
greeting() {
alert(this.name);
}
}
let person = new Person("Bob");
Вопросы:
Три функции добавляют имя и приветствие к прототипу объекта Person. Это утверждение правильно?
Код в блоке № 3 использует новое ключевое слово класса ES6 и работает «за кулисами» иначе, чем код в блоке № 1 и блоке № 2. (PS. Я пишу «за кулисами», потому что у меня пока нет четкого представления о том, что происходит под капотом, когда я вызываю функцию, но на данный момент я предполагаю, что я слишком новичок для глубокого погружения).
Код в блоках № 1 и № 2 одинаков и работает «за кадром» одинаково. Разница в коде между ними состоит в том, что в блоке № 1 мы сохраняем переменную name
и функцию greeting
в одном и том же блоке кода, в то время как в блоке № 2 мы сохраняем функцию greeting
отдельно от переменная name
(добавление функции greeting
к прототипу Person с использованием Person.prototype.greeting
)
Используя Person.prototype.greeting = function () {...}
в блоке № 2, мы достигаем того же результата, что и this.greeting = function (...)
ниже this.name
в блоке № 1
Спасибо!