文档很清楚:
使用指定的原型对象和属性创建一个新对象。
新对象Test
的原型也是如此。所有实例都引用相同的原型,并且作为options
一个对象,它们也共享对这个原型的引用。
关系如下所示:
+------------+ +---------+ +--------+
| Instance 1 |----->| Test | | Object |
+------------+ | | | |
| options-|------>| name |
| name | +--------+
+---------+
^
+------------+ |
| Instance 2 |-----------+
+------------+
现在,作为options
一个对象,如果您为其分配一个新属性,例如
instance1.object.name2 = 'bar';
您实际上正在访问 Test.options
. 结果将是:
+------------+ +---------+ +--------+
| Instance 1 |----->| Test | | Object |
+------------+ | | | |
| options-|------>| name |
| name | | name2 |
+---------+ +--------+
^
+------------+ |
| Instance 2 |-----------+
+------------+
但是,当您为 分配新值时,将在该实例中创建name
一个新属性。name
所以当你这样做时:
instance1.name = 'bar';
结果将是
+------------+ +---------+ +--------+
| Instance 1 |----->| Test | | Object |
| | | | | |
| name | | options-+------>| name |
+------------+ | name | +--------+
+---------+
^
+------------+ |
| Instance 2 |-----------+
+------------+
options
如果您不只是访问或分配 /to 的属性,而是为它分配了一个新值,也会发生同样的情况:
instance1.options = {name: 'another name'};
结果是:
+--------+
| Object |
| |
| name |
+--------+
^
+------------+ | +---------+ +--------+
| Instance 1 |--+-->| Test | | Object |
| | | | | | |
| options----+--+ | options-|------>| name |
+------------+ | name | +--------+
+---------+
^
+------------+ |
| Instance 2 |-----------+
+------------+
由于属性查找的工作方式,将返回原型链中instance1.options
最近(最近)属性的值。options
一旦我们在实例中设置name
or options
,它将返回那些值,而不是原型 ( Test
) 的值。