Javascript 原型中的对象属性

Javascript 原型中的对象属性,javascript,Javascript,我有一个无法解决的问题,因为我无法解释这种行为: var A = function(value) { this.prop = value; }; A.prototype = { prop: 0 }; var a = new A(1); var b = new A(2); console.log(a.prop); console.log(b.prop); 输出: 1 2 但是,使用此代码(几乎相同): 我有以下输出: 2 2 谁能给我解释一下吗? 谢谢 编辑: 这里有一

我有一个无法解决的问题,因为我无法解释这种行为:

var A = function(value) {
    this.prop = value;
};

A.prototype = {
    prop: 0
};

var a = new A(1);
var b = new A(2);

console.log(a.prop);
console.log(b.prop);
输出:

1
2
但是,使用此代码(几乎相同):

我有以下输出:

2
2
谁能给我解释一下吗? 谢谢

编辑:

这里有一个解决方案:

var A = function(value) {
    this.prop = {};
    this.prop.value = value;
};

A.prototype = {

};

var a = new A(1);
var b = new A(2);

console.log(a.prop.value);
console.log(b.prop.value);

prototype只创建一次,并且它只是一个简单的对象,其子对象对于它所属的函数的所有实例都是附加的

所以基本上和你写的一样:

var obj = { value: 0 };

var a = {}, b = {};

a.obj = obj;
b.obj = obj;

obj.value = 2;

正如您可以看到的,
a.obj
b.obj
对相同的
obj
a.obj.value
b.obj.value的引用都是
2
在本例中,原型只创建了一次,它只是一个简单的对象,其子对象被附加到它所属函数的所有实例中对

所以基本上和你写的一样:

var obj = { value: 0 };

var a = {}, b = {};

a.obj = obj;
b.obj = obj;

obj.value = 2;

如您所见,在本例中,
a.obj
b.obj
都引用了相同的
obj
,并且
a.obj.value
b.obj.value
都将
2
在所有实例之间共享原型属性。
然而,您可以在每个实例上覆盖它,这就是您在第一个示例中所做的。
在每个实例中重写后,您将不再使用obj.prop访问prototype属性,它现在引用实例属性。您需要使用obj.prototype.prop再次读取它,但此语法是非法的:您可以使用
obj.\uuu proto\uuuu.prop
(非标准)或
Object.getPrototypeOf(obj).prop
(EcmaScript 5)来执行此操作。

在第二个实例中,您不会更改构造函数中的属性:而是更改此属性的属性。所以两个构造函数都访问同一个对象,然后更改其中一个属性值,最后一个设置它的将是“win”。在这里,原型属性不被实例属性覆盖(“隐藏”),访问obj.prop实际上是访问“obj.prototype.prop”

将原型属性视为所有实例之间共享的属性。
然而,您可以在每个实例上覆盖它,这就是您在第一个示例中所做的。
在每个实例中重写后,您将不再使用obj.prop访问prototype属性,它现在引用实例属性。您需要使用obj.prototype.prop再次读取它,但此语法是非法的:您可以使用
obj.\uuu proto\uuuu.prop
(非标准)或
Object.getPrototypeOf(obj).prop
(EcmaScript 5)来执行此操作。

在第二个实例中,您不会更改构造函数中的属性:而是更改此属性的属性。所以两个构造函数都访问同一个对象,然后更改其中一个属性值,最后一个设置它的将是“win”。在这里,原型属性不被实例属性覆盖(“隐藏”),访问obj.prop实际上是访问“obj.prototype.prop”

这是因为在JS中,对象是通过引用传递的,而原语不是


由于原型在两个实例之间共享,因此修改原型上的对象将更新所有实例。

这是因为在JS中,对象是通过引用传递的,而原语不是


由于原型在两个实例之间共享,因此修改原型上的对象将更新所有实例。

在示例1中,
this.prop
是一种基本类型,由值引用,因此实例之间不共享

在示例2中,
this.prop
是一个对象,它的引用是从一个对象的原型初始化的,因此这个对象由所有实例共享

在上一个“示例”解决方案中,您使用
={}
创建了一个新对象,因此所有实例现在都有自己的对象


有关基本类型的更多详细信息:

在示例1中,
this.prop
是一个基本类型,由值引用,因此实例之间不共享

在示例2中,
this.prop
是一个对象,它的引用是从一个对象的原型初始化的,因此这个对象由所有实例共享

在上一个“示例”解决方案中,您使用
={}
创建了一个新对象,因此所有实例现在都有自己的对象


有关基元类型的更多详细信息:

在JS中,对象是通过引用值传递的-存在细微差异在JS中,对象是通过引用值传递的-存在细微差异您正在变异共享对象(变异是在您重新分配子属性或调用更改对象的函数时发生的)。道具是共享的,因为它位于原型上,并且您不重新分配它(道具=newValue),如果您要重新分配它,那么道具将被实例(a和b)遮挡。这里有更多关于原型和构造函数的内容:您正在修改共享对象(当您重新分配子属性或调用更改对象的函数时,会进行修改)。道具是共享的,因为它位于原型上,并且您不重新分配它(道具=newValue),如果您要重新分配它,那么道具将被实例(a和b)遮挡。这里有更多关于原型和构造函数的内容:更准确地说:A.prototype.prop是原语还是对象并不重要。当使用this.prop在构造函数中赋值时,prop值将被隐藏。第二个示例没有重新分配它,而是对它进行了变异。因为原语不能变异,所以改变原语的唯一方法就是重新分配原语,从而给原语加上阴影。在示例1中,prop值也被共享,如下答案所示:为了更准确:A.prototype.prop是primitive还是object无关紧要。当使用this.prop在构造函数中赋值时,prop值将被隐藏。第二个示例没有重新分配它,而是对它进行了变异。因为原语不能变异,所以改变原语的唯一方法就是重新分配原语,从而给原语加上阴影。在示例1中,道具值也共享为以下值