Как понять когда цепочка прототипов завершается?
В первом случае цепочка прототипов длиннее, чем во втором.
function Func() {};
Func.__proto__ == Function.prototype; //true
Func.__proto__.__proto__ == Object.prototype; //true
Func.__proto__.__proto__.__proto__ == Object.prototype; //false
Func.__proto__.__proto__.__proto__.__proto__ == Object.prototype; //Cannot read property '__proto__' of null
Во втором случае она короче.
let obj = {};
obj.__proto__ == Object.prototype; //true
obj.__proto__.__proto__ == Object.prototype; //false
obj.__proto__.__proto__.__proto__ == Object.prototype; //Cannot read property '__proto__' of null
Почему? В предпоследней строчке второго примера obj.__proto__.__proto__ == Object.prototype непонятно почему выдает false. Хотя у Object.prototype тоже вроде бы как должно быть св-во __proto__. В первом же случае в строке Func.__proto__.__proto__ == Object.prototype св-во __proto__ есть. Почему же здесь его нет? В чем разница?
Ответы (1 шт):
- В первом случае у вас цепочка прототипов на одно звено больше, потому что в начале там подкласс объекта, а не чистый объект.
__proto__не всегда ссылается наObject.prototype, поэтому в этом нет противоречия:
В предпоследней строчке второго примера
obj.__proto__.__proto__ == Object.prototypeнепонятно почему выдаетfalse. Хотя уObject.prototypeтоже вроде бы как должно быть св-во__proto__.
Object.prototype.__proto__ ссылается не на Object.prototype, а на null, иначе получилась бы циклическая, бесконечная цепочка прототипов.