我很困惑为什么instance
的{{1}}例如Person
能够更改属性person1
,jobs
,在array
中定义,但不在Person.prototype
和name
等其他属性中定义。 height
尝试修改其person2
后Person.prototype
调用person1
的属性时会看到这种情况。我很欣赏任何想法或想法。谢谢。
properties
答案 0 :(得分:1)
因为你做的时候
person1.height = 5;
对象person1
引用获取自己的 height
属性,该属性隐藏了从其原型继承的height
。
但是当你这样做时:
person1.jobs.push('cook');
你不是将分配给jobs
,你只是改变jobs
所指的(数组)的状态。所以你要改变原型上的那个。
如果你这样做了:
person1.jobs = ['cook'];
就像我们的height
示例一样,person1
会获得拥有的 jobs
属性。如果你想保留原型所具有的作业,你可以先复制数组:
person1.jobs = person1.jobs.slice();
person1.jobs.push('cook');
让我们来看看记忆中发生了什么:
当你在Person
属性上创建了Person.prototype
函数和对象时,我们在内存中有这个:
+------------------------------------------+ | | | | \ +------------+ | Person---->| (function) | | +------------+ +---------------+ | | prototype |---->| (object) | | +------------+ +---------------+ | | constructor |---+ | getInfo |------>(not shown) | name: "Hello" | | height: 6 | +----------------+ | jobs |----->| (array) | +---------------+ +----------------+ | 0: "developer" | | 1: "student" | +----------------+
然后我们
var person1 = new Person();
我们有这个:
+----------------------------------------------+ | | | | \ +------------+ | Person---->| (function) | | +------------+ +---------------+ | | prototype |-------->| (object) | | +------------+ / +---------------+ | | | constructor |---+ | | getInfo |------>(not shown) | | name: "Hello" | | | height: 6 | +----------------+ | | jobs |----->| (array) | | +---------------+ +----------------+ | | 0: "developer" | | | 1: "student" | | +----------------+ +---------------+ | person1--->| (object) | | +---------------+ | | [[Prototype]] |---+ +---------------+
执行此操作时:
person1.height = 5;
person1
获取拥有 height
(其他所有内容保持不变):
(to Person.prototype) +---------------+ | person1--->| (object) | | +---------------+ | | [[Prototype]] |---+ | height: 5 | +---------------+
但是person1.jobs.push('cook');
只是将数组jobs
的状态更改为:
+----------------------------------------------+ | | | | \ +------------+ | Person---->| (function) | | +------------+ +---------------+ | | prototype |-------->| (object) | | +------------+ / +---------------+ | | | constructor |---+ | | getInfo |------>(not shown) | | name: "Hello" | | | height: 6 | +----------------+ | | jobs |----->| (array) | | +---------------+ +----------------+ | | 0: "developer" | | | 1: "student" | | +->| 2: "cook" | | | +----------------+ +---------------+ | | person1--->| (object) | | | +---------------+ | NOTE WHAT | | [[Prototype]] |---+ CHANGED ----+ | height: 5 | +---------------+
答案 1 :(得分:0)
如果是jobs
,您正在改变对象,而不是重新分配对象。
如果是person1.height = 5;
,则表示您正在分配。因此,它分配给person1
但不分配给原型。如果是jobs
,你只是在变异,所以效果是可见的。通过原型继承来了解更多信息。