Если создать новый объект с помощью 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
Комментариев нет:
Отправить комментарий