Javascript 设置从prototype继承的属性值,为什么prototype值不变?
我用Chrome做了一些测试。 很简单,我更改继承的属性值。 我假设该集合将发生在prototype对象上,但prototype值不变 实际上,在子对象上创建了一个新属性。 这是预期的吗Javascript 设置从prototype继承的属性值,为什么prototype值不变?,javascript,Javascript,我用Chrome做了一些测试。 很简单,我更改继承的属性值。 我假设该集合将发生在prototype对象上,但prototype值不变 实际上,在子对象上创建了一个新属性。 这是预期的吗 > function Shape() {}; > var base = new function() { this.mValue = 10; }; > Shape.prototype = base; > var s = new Shape(); > s.mValue = 20; &
> function Shape() {};
> var base = new function() { this.mValue = 10; };
> Shape.prototype = base;
> var s = new Shape();
> s.mValue = 20;
> base;
< Object {mValue: 10}
>函数形状(){};
>var base=new function(){this.mValue=10;};
>Shape.prototype=基础;
>var s=新形状();
>s.M值=20;
>基础;
设置从prototype继承的属性值,为什么prototype值不变
因为当您指定给s.mValue
时,它会在s
上创建一个新属性,该属性会在原型上隐藏该属性
属性访问的工作原理如下:
- 如果要获取属性的值,它首先会查看对象本身,看看它是否拥有该属性。如果是,则返回该对象的值。如果没有,它将查看对象的原型,依此类推
- 如果您正在设置属性的值,它将在对象本身上设置属性,而不是在原型链上
function Shape() {};
var base = new function() { this.mValue = 10; };
Shape.prototype = base;
我们的记忆中有这样的东西:
+------------------+
Shape-->| function |
+------------------+ +------------+
| prototype |-+->| object |
+------------------+ | +------------+
| | mValue: 10 |
base-------------------------+ +------------+
并获得:
+------------------+
Shape-->| function |
+------------------+ +------------+
| prototype |-+->| object |
+------------------+ | +------------+
| | mValue: 10 |
base-------------------------+ +------------+
|
+-----------+ |
s--->| object | |
+-----------+ |
| __proto__ |-----------+
+-----------+
+------------------+
Shape-->| function |
+------------------+ +------------+
| prototype |-+->| object |
+------------------+ | +------------+
| | mValue: 10 |
base-------------------------+ +------------+
|
+------------+ |
s--->| object | |
+------------+ |
| __proto__ |----------+
| mValue: 20 |
+------------+
并获得:
+------------------+
Shape-->| function |
+------------------+ +------------+
| prototype |-+->| object |
+------------------+ | +------------+
| | mValue: 10 |
base-------------------------+ +------------+
|
+-----------+ |
s--->| object | |
+-----------+ |
| __proto__ |-----------+
+-----------+
+------------------+
Shape-->| function |
+------------------+ +------------+
| prototype |-+->| object |
+------------------+ | +------------+
| | mValue: 10 |
base-------------------------+ +------------+
|
+------------+ |
s--->| object | |
+------------+ |
| __proto__ |----------+
| mValue: 20 |
+------------+
只是FWIW.
s.mValue
不是原型mValue
是对象s
的自有属性,因此更改原型mValue的唯一方法是首先获取原型的引用?然而,js不允许您从对象“s”获取原型的引用。您应该认真地重新考虑为什么要更改原型中的某些内容。很少有情况下这是最好的方法。
function Shape() {} // No need for ; after function declarations, they're not statements
Shape.prototype.mValue = 10;
var s = new Shape();
s.mValue = 20;
Shape.prototype;