Может ли кто-нибудь объяснить, что будет дальше, когда я o1.set('bar');
? Мне интересно, почему o2.name
также установлен в это время, и то же самое не происходит, когда я o2.set('fox');
, я имею в виду, o1.name
остается bar
.Использование Javascript указателей Object.create и свойств не разыменовывается из прототипа
Почему o1.name и o2.name указывают на тот же объект, хотя я изменил старое значение (foo
), но то же самое не происходит, когда я изменяю o2.name?
var Person = {
\t name: "foo",
\t get: function get() {
\t \t return this.name;
\t },
\t set: function set(sur) {
\t \t this.name = sur;
\t }
},
o1 = Person,
o2 = Object.create(o1);
// true "foo" "foo"
console.log(o1.name === o2.name, o1.get(), o2.get());
o1.set('bar');
// true "bar" "bar"
console.log(o1.name === o2.name, o1.get(), o2.get());
o2.set('fox');
// false "bar" "fox"
console.log(o1.name === o2.name, o1.get(), o2.get());
Другой поведение можно увидеть ниже. Разница здесь в том, что я продлеваю прототип Person даже для объекта o1
.
\t var Person = {
\t \t name: "foo",
\t \t get: function get() {
\t \t \t return this.name;
\t \t },
\t \t set: function set(sur) {
\t \t \t this.name = sur;
\t \t }
\t },
\t o1 = Object.create(Person),
\t o2 = Object.create(Person);
\t // true "foo" "foo"
\t console.log(o1.name === o2.name, o1.get(), o2.get());
\t o1.set('bar');
\t // false "bar" "foo"
\t console.log(o1.name === o2.name, o1.get(), o2.get());
\t o2.set('fox');
\t // false "bar" "fox"
\t console.log(o1.name === o2.name, o1.get(), o2.get());
очень хороший @Pointy не могли бы вы добавить некоторые ссылки по этой теме, которые объясняются глубоко? – thiagoh
@thiagoh Я не знаю какой-либо конкретной ссылки для этого поведения; это то, как язык работает. – Pointy