Прототипы и наследование Flashcards
Как задать прототип объекта …
rabbit.__proto__=animal;
Свойство [[Prototype]] является …
..внутренним и скрытым, но есть много способов задать его.
__proto__ — …. [[Prototype]] ?
__proto__ — не то же самое, что [[Prototype]]. Это геттер/сеттер для него..
По спецификации __proto__ должен поддерживаться только браузерами …
но по факту все среды, включая серверную, поддерживают его. это самый короткий и интуитивно понятный способ установки и чтения прототипа
Какие функции аналогичны __proto__ ?
Object.getPrototypeOf()/Object.setPrototypeOf()
Как называются свойства, доставшиеся объекту от прототипа ?
унаследованными
задать прототип через свойство ..
rabbit{
__proto__:animal;
}
что такое цепочка прототипов ..
rabbit{ \_\_proto\_\_:animal; }; longear{ \_\_proto\_\_:rabbit; };
какие ограничения на цепочки ?
нельзя зациклить; значением может быть объектом или null другие игнорируются
как отфильтровать только собственные свойства ?
for (let prop in obj) { let ownProp = obj.hasOwnProperty(prop); }
Почему наедаются оба хомяка?
У нас есть два хомяка: шустрый (speedy) и ленивый (lazy); оба наследуют от общего объекта hamster.
Когда мы кормим одного хомяка, второй тоже наедается. Почему? Как это исправить?
let hamster = { stomach: [],
eat(food) {
this.stomach.push(food);
}
};
let speedy = { \_\_proto\_\_: hamster };
let lazy = { \_\_proto\_\_: hamster };
// Этот хомяк нашёл еду
speedy.eat(“apple”);
alert( speedy.stomach ); // apple
// У этого хомяка тоже есть еда. Почему? Исправьте alert( lazy.stomach ); // apple
Сначала в прототипе (=hamster) находится метод speedy.eat, а затем он выполняется с this=speedy (объект перед точкой).
Затем в this.stomach.push() нужно найти свойство stomach и вызвать для него push. Движок ищет stomach в this (=speedy), но ничего не находит.
Он идёт по цепочке прототипов и находит stomach в hamster.
И вызывает для него push, добавляя еду в живот прототипа.
Получается, что у хомяков один живот на двоих!
И при lazy.stomach.push(…) и при speedy.stomach.push(), свойство stomach берётся из прототипа (так как его нет в самом объекте), затем в него добавляются данные.
Обратите внимание, что этого не происходит при простом присваивании this.stomach=:
let hamster = { stomach: [],
eat(food) { // присвоение значения this.stomach вместо вызова this.stomach.push this.stomach = [food]; } };
let speedy = { \_\_proto\_\_: hamster };
let lazy = { \_\_proto\_\_: hamster };
// Шустрый хомяк нашёл еду
speedy.eat(“apple”);
alert( speedy.stomach ); // apple
// Живот ленивого хомяка пуст
alert( lazy.stomach ); //
Теперь всё работает правильно, потому что this.stomach= не ищет свойство stomach. Значение записывается непосредственно в объект this.
метод Округлить до заданной точности..
num.toFixed(2);
какое важное свойство есть у каждого объекта ..?
.__proto__
Какой объект является финальным прототипом у любого объекта..?
базовый элемент Object //{}
Как в новом стандарте указывается прототип ..?
class Cat extends Animal { constructor(){ super(); this.mustache=true; } getVoice(){ return "Mjauu"; }; }