Страницы

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

понедельник, 15 июля 2019 г.

Как происходит перезаписывание конструктора в прототипе

Если создать новый объект с помощью Object.create и указать в нём прототип и сделать его прототипом конструктора, родной конструктор не перезапишется. А если просто объект сделать прототипом конструктора, то он перезапишется. Как это удаление происходит? Не понимаю логику перезаписи конструктора. Или так поставлю вопрос. Почему в первом случае конструктор не перезаписался, а во втором перезаписался?
function Animal() {}
function Rabbit() {} Rabbit.prototype = Object.create(Animal.prototype);
var rabbit = new Rabbit();
alert( rabbit instanceof Rabbit ); выдаст true
Rabbit.prototype = {};
alert( rabbit instanceof Rabbit ); выдаст false!


Ответ

При выполнении оператора instanceof идет последовательная проверка прототипов
И так как перед второй проверкой прототип в Rabbit изменился, следующая проверка возвращает false
Фактически вызов этого оператора можно описать следующим циклом:
function instanceOf(object, Proto) var proto = Proto.prototype; while(true){ var objectProto = Object.getPrototypeOf(object); if(objectProto == null) return false; if(Object.is(objectProto, proto)) return true; } }
Таким образом видно, что после смены прототипа у Rabbit, этот цикл продолжается пока полученный прототип не будет null и оператор не вернет false

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

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