Страницы

Поиск по вопросам

четверг, 11 октября 2018 г.

В чем отличие __proto__ от prototype?

В чем различие этих 2 способов прототипного наследования и какой из них более правильнее использовать?
function Cat() { this.__proto__.type = 'кот'; } var cat = new Cat(); console.log(cat.type); // кот function CatTwo() { } CatTwo.prototype.type = 'тоже кот'; var catTwo = new Cat(); console.log(catTwo.type); // тоже кот


Ответ

На самом деле в примере в вопросе нет наследования.

__proto__ до недавнего времени не был стандартизирован.
В последних спецификациях можно найти, что getter __proto__, обертка над вызовом внутренней функции [[GetPrototypeOf]]
Точно такая же, как и функция Object.getPrototypeOf

Если применительно к приведенному коду:
в первом случае значение прототипа меняется каждый раз при создании объекта, во втором - устанавливается всего один раз.
Отсюда можно сделать вывод, что если есть доступ к конструктору, прототип лучше менять непосредственное у него.

Пример, когда приведенный код выдаст разные значения:
function Cat(type) { this.__proto__.type = type; } var cat = new Cat('кот'); console.log(cat.type); // кот var cat2 = new Cat('кот2'); console.log(cat.type); // кот2 console.log(cat2.type); // кот2 function CatTwo() {} CatTwo.prototype.type = 'тоже кот'; var catTwo = new CatTwo(); console.log(catTwo.type); // тоже кот

Комментариев нет:

Отправить комментарий