Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 设置从prototype继承的属性值,为什么prototype值不变?_Javascript - Fatal编程技术网

Javascript 设置从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; &

我用Chrome做了一些测试。 很简单,我更改继承的属性值。 我假设该集合将发生在prototype对象上,但prototype值不变

实际上,在子对象上创建了一个新属性。 这是预期的吗

> 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
上创建一个新属性,该属性会在原型上隐藏该属性

属性访问的工作原理如下:

  • 如果要获取属性的值,它首先会查看对象本身,看看它是否拥有该属性。如果是,则返回该对象的值。如果没有,它将查看对象的原型,依此类推

  • 如果您正在设置属性的值,它将在对象本身上设置属性,而不是在原型链上

显然,这是一个简单的版本。:-)

如果您是从基于类的语言开始学习它,这可能会有点令人惊讶,但是一旦您理解了它,它就非常简单了

为了清晰起见,让我们在下面的代码中加入一些ASCII艺术:

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;