Прототипы и наследование Flashcards

1
Q

Как задать прототип объекта …

A

rabbit.__proto__=animal;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Свойство [[Prototype]] является …

A

..внутренним и скрытым, но есть много способов задать его.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

__proto__ — …. [[Prototype]] ?

A

__proto__ — не то же самое, что [[Prototype]]. Это геттер/сеттер для него..

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

По спецификации __proto__ должен поддерживаться только браузерами …

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Какие функции аналогичны __proto__ ?

A

Object.getPrototypeOf()/Object.setPrototypeOf()

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Как называются свойства, доставшиеся объекту от прототипа ?

A

унаследованными

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

задать прототип через свойство ..

A

rabbit{
__proto__:animal;
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

что такое цепочка прототипов ..

A
rabbit{
\_\_proto\_\_:animal;
};
longear{
\_\_proto\_\_:rabbit;
};
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

какие ограничения на цепочки ?

A

нельзя зациклить; значением может быть объектом или null другие игнорируются

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

как отфильтровать только собственные свойства ?

A
for (let prop in obj) {
let ownProp = obj.hasOwnProperty(prop);
}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Почему наедаются оба хомяка?

У нас есть два хомяка: шустрый (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
A

Сначала в прототипе (=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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

метод Округлить до заданной точности..

A

num.toFixed(2);

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

какое важное свойство есть у каждого объекта ..?

A

.__proto__

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Какой объект является финальным прототипом у любого объекта..?

A

базовый элемент Object //{}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Как в новом стандарте указывается прототип ..?

A
class Cat extends Animal {
      constructor(){
                super();
                this.mustache=true;
      }
      getVoice(){
                return "Mjauu";
      };
}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly