Были ли случаи, когда объект не проходит свою цепочку прототипов, чтобы получить значение?

Как мы знаем, когда мы пытаемся получить доступ к свойству объекта, сначала проверяется, есть ли у объекта собственное свойство. Если не находит, то обходит прототип и проверяет, и так далее по цепочке прототипов.

Что касается вопроса, проверьте приведенный ниже фрагмент кода (http://jsbin.com/mabajidoti/edit?js,console)

function CT() {}
CT.prototype.myValue = 4;
var myObj = Object.create(CT);

console.log(myObj.myValue);          //logs undefined
console.log(myObj.prototype.myValue) //logs 4

Из приведенного выше фрагмента первый оператор console.log, myObj.myValue возвращает undefined, хотя myValue доступен в его прототипе (2-й оператор console.log)? Разве он не должен был пройти цепочку прототипов, чтобы получить значение myValue?


person Bijoy valappil    schedule 04.11.2017    source источник
comment
CT.prototype используется как прототип новых экземпляров CT. Object.create(CT); создает новый объект с самим CT в качестве прототипа. Если вы хотите, чтобы CT.prototype был прототипом, вам нужно было вызвать Object.create(CT.prototype).   -  person Felix Kling    schedule 04.11.2017
comment
Были ли случаи, когда объект не проходит свою цепочку прототипов, чтобы получить значение? Нет.   -  person Felix Kling    schedule 04.11.2017


Ответы (2)


Вы, кажется, перепутали Object.create() с вызовом функции-конструктора с помощью оператора new.

Если бы ты сказал:

var myObj = new CT();

тогда ваш myObj будет связан с CT.prototype и, таким образом, myObj.myValue будет 4.

Но с помощью Object.create(CT) вы создали новый объект, прототипом которого является сама функция CT. Таким образом, CT.prototype не является частью цепочки прототипов вашего нового объекта. Обратите внимание, что CT.prototype не входит в цепочку прототипов CT, а указывает объект, который будет прототипом для вещей, созданных с помощью new CT().

Более правильно использовать Object.create() для доступа к свойству myValue из прототипа:

var CT = {
  myValue : 4
};
var myObj = Object.create(CT);
console.log(myObj.myValue);          //logs 4

Или с вашей существующей функцией CT() и CT.prototype вы могли бы сказать:

myObj = Object.create(CT.prototype);
person nnnnnn    schedule 04.11.2017

прототип является переменной экземпляра, вы можете получить доступ к прототипу с помощью obj.prototypeName при создании объекта с помощью new Obj()

сначала см. Массив

Array.forEach
// undefined

Array.prototype.forEach
// ƒ forEach() { [native code] }

new Array().forEach
// ƒ forEach() { [native code] }

[].forEach
// ƒ forEach() { [native code] }

см. свой класс CT

function CT() {}
CT.prototype.myValue = 4;
var ct1 = new CT();
var ct2 = new CT();

ct1.myValue = 100;

console.log(ct1.myValue); //logs 100
console.log(ct2.myValue); //logs 4
person Paul Tsai    schedule 04.11.2017