Расширение прототипа на объектном литерале
Если у меня есть следующий код, почему он возвращает ошибку, говорящую Не могу установить свойство 'second_prop' из неопределенного. Я думал, что вы можете расширить свойство prototype и добавить больше переменных и методов в прототип объекта. Поскольку два оператора консоли возвращают 'Object' и true, тогда почему он возвращает ошибку undefined. Я думаю, что если 'obj' является объектом типа Object, то я должен быть в состоянии сделать temp.prototype.newproperty? Так что тогда у объекта будет "новое свойство". Но я явно ошибаюсь, поэтому я кое-что здесь упускаю. Более того, зачем мне делать Object.create(), когда объект уже является литералом объекта? Разве это уже не объект? Я просто смотрю на некоторые примеры и пытаюсь понять это
var obj = {
first_property: 'first property'
}
console.log(typeof obj);
console.log(obj instanceof Object);
var temp = Object.create(obj);
temp.prototype.second_prop = 'second property'
Выход
//object
//true
//Uncaught TypeError: Cannot set property 'second_prop' of undefined
Итак, почему я не могу сделать temp.prototype или obj.prototype?
3 ответа
Если у меня есть следующий код, почему он возвращает ошибку, говорящую Не могу установить свойство 'second_prop' из неопределенного
Литеральный объект Javascript уже является экземпляром объекта и не имеет .prototype
имущество. Это свойство находится в функции конструктора, а не в уже созданном объекте. В любом текущем браузере (IE9+) вы можете использовать Object.getPrototypeOf()
получить прототип для уже построенного объекта.
Но, похоже, вам лучше просто клонировать объект, а затем добавить свойства клону. Или, если вы хотите, чтобы оба объекта имели одно и то же дополнительное свойство, добавьте свойство, а затем клонируйте его. Или, если вы просто хотите использовать свой буквальный объект, просто используйте его как есть.
Как только объект уже построен, прототип является внутренним свойством, и, как правило, он не предназначен для того, чтобы связываться с ним. Если вы намереваетесь изменить прототип для всех объектов, вы должны изменить прототип в конструкторе. Если вы хотели изменить свойства только для этого экземпляра объекта, просто измените свойства самого объекта, а не прототипа.
Как всегда, если вы опишите, чего вы на самом деле пытаетесь достичь (а не почему ваше собственное решение не дает того, что вы ожидали), мы можем помочь вам гораздо лучше.
Я думал, что вы можете расширить свойство prototype и добавить больше переменных и методов в прототип объекта.
Можно, но .prototype
свойство находится на конструкторе, а не на уже построенном объекте.
Поскольку два оператора консоли возвращают 'Object' и true, тогда почему он возвращает ошибку undefined. Я думаю, что если 'obj' является объектом типа Object, то я должен быть в состоянии сделать temp.prototype.newproperty?
Вы путаете быть созданным объектом как конструктор с прототипом. Созданный объект имеет прототип как внутреннее свойство, а не как открытый .prototype
имущество. Таким образом, когда что-то сообщает instanceof, это означает, что оно буквально является экземпляром объекта такого типа (и, следовательно, имеет прототип объектов этого типа в своей внутренней цепочке прототипов), а не то, что это конструктор с открытым доступом. .prototype
имущество.
Более того, зачем мне делать Object.create(), когда объект уже является литералом объекта? Разве это уже не объект?
Цель Object.create()
является создание нового объекта, используя существующий объект в качестве прототипа. Если вы объявили литерал Javascript, и вы просто хотите использовать литерал как объект сам по себе, то НЕТ причин использовать Object.create()
в теме. Просто используйте литерал в качестве уже построенного объекта.
temp
не имеет прототипа Объект имеет прототип. Вы можете изменить прототип для всех объектов, вызвав Object.prototype
но вы не можете изменить его только для одного объекта.
.prototype - это свойство, которое не всегда связано с фактическим прототипом объекта. Реальный прототип может быть принят через .__proto__
var obj = {
first_property: 'first property'
}
console.log(typeof obj);
console.log(obj instanceof Object);
var temp = Object.create(obj);
temp.__proto__.second_prop = 'second property';
console.log(Object.getPrototypeOf(temp));
//{ first_property: 'first property',
//second_prop: 'second property' }