Я такой человек, который должен знать все в глубине ... Итак, я проходил много предметов, и я поставил свою ногу в глубины наследия прототипа.
У меня есть четкое представление о том, как это работает в ES5 (каждая функция имеет это свойство специального прототипа, которое указывает на объект, на котором он основан. Этот объект имеет свойство .constructor, которое указывает на функцию и т. Д.). ,Сколько классов ES6 отличается от ES5?
Итак, теперь давайте посмотрим пример ES5:
function Bunny(name) {
this.name = name
}
Bunny.prototype.sayName = function() {
console.log('Im',this.name)
}
Это один довольно ясно: функция Банни получает аргумент name
который будет назначить на новый объект.
Следующая строка добавляет функцию прототипу функции, которая будет возвращать текущее имя.
Давайте посмотрим класс ES6 Сейчас:
class Fox{
constructor(name){
this.name = name;
}
sayName() {
console.log('Im', this.name)
}
}
же материал здесь: Constructor
здесь, как наша функция Кролика. Но sayName
в лисе не то же самое, что и sayName
в Bunny.
Давайте создадим экземпляры:
let bunny = new Bunny('Henry');
let fox = new Fox('Jerry');
И теперь, проверить свои прототипы:
console.log(Object.getPrototypeOf(bunny))
console.log(Object.getPrototypeOf(fox))
Что мы получаем?
//using repl.it - ES6
{ sayName: [Function] }
{}
Почему?
Я думал, что это может быть потому, что мы непосредственно установили функцию sayName
на прототипе Bunny. Таким образом, я изменил его к этому:
function Bunny(name) {
this.name = name
//Warning - Bad practice ahead!
this.sayName = function() {
console.log('Im',this.name)
}
}
Результат:
//using repl.it - ES6
{}
{}
Это будет иметь смысл, если бы не это:
console.log(bunny.hasOwnProperty('sayName'))
console.log(fox.hasOwnProperty('sayName'))
Это означает, fox
не владеет sayName
на он, либо прототип показывает, что он есть. Я что-то упустил? Почему они разные?
Почему второй пример плохой практики? – evolutionxbox
@evolutionxbox Поскольку он создает новую функцию для каждого экземпляра. –
Никогда не используйте 'console.log' для проверки объекта. Используйте 'console.dir'. –