Javascript:为什么实例能够更改数组但不能更改原型中定义的其他属性?

时间:2016-07-12 09:20:40

标签: javascript

我很困惑为什么instance的{​​{1}}例如Person能够更改属性person1jobs,在array中定义,但不在Person.prototypename等其他属性中定义。 height尝试修改其person2Person.prototype调用person1的属性时会看到这种情况。我很欣赏任何想法或想法。谢谢。

properties

2 个答案:

答案 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,你只是在变异,所以效果是可见的。通过原型继承来了解更多信息。