【发布时间】:2015-11-02 16:25:51
【问题描述】:
当我o1.set('bar'); 时,谁能解释下面发生了什么?我想知道为什么此时还设置了o2.name,而当我o2.set('fox');,我的意思是o1.name 仍然是bar 时,同样的情况不会发生。
为什么 o1.name 和 o2.name 指向同一个对象,即使我更改了旧值 (foo) 但更改 o2.name 时却没有发生同样的情况?
var Person = {
name: "foo",
get: function get() {
return this.name;
},
set: function set(sur) {
this.name = sur;
}
},
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());
下面可以看到另一种行为。这里的不同之处在于,我甚至为 o1 对象扩展了 Person 原型。
var Person = {
name: "foo",
get: function get() {
return this.name;
},
set: function set(sur) {
this.name = sur;
}
},
o1 = Object.create(Person),
o2 = Object.create(Person);
// true "foo" "foo"
console.log(o1.name === o2.name, o1.get(), o2.get());
o1.set('bar');
// false "bar" "foo"
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());
【问题讨论】:
标签: javascript object prototype prototypal-inheritance