我使用“this.value = 1;”得到完全相同的结果在构造函数内部或只是将属性值放在函数构造函数的原型中 - “MyClass.prototype.value = 1;”
function MyClass() {
//this.value=1;
}
MyClass.prototype.value =1;
var a = new MyClass();
document.write(a.value + "<br>");
a.value=13;
document.write(a.value + "<br>");
var b = new MyClass();
document.write(b.value);
结果是:
1
13
1
因为最后一个值是1,显然每个对象(a,b)都在它自己的内存块中获得它自己的值副本 那么,如果原型值不在对象之间共享,究竟是什么原因?
答案 0 :(得分:6)
你的考试似是而非。原型值 在值之间共享,但在写a.value = 13
时,您MyClass.prototype.value
上的a
属性shadowed。试试这个尺寸:
function MyClass() {}
MyClass.prototype.value = 1;
var a = new MyClass();
document.write(a.value + "<br>");
a.__proto__.value=13;
document.write(a.value + "<br>");
var b = new MyClass();
document.write(b.value);
(demo)
对象属性查找沿着原型链向上移动,直到原型为null,或者找到具有指定名称的属性。在原始测试中a.value = 13
导致a.value
上的查找以a
结束 - 因为在该对象上有一个名为value
的属性 - 在到达原型之前。
更多阅读:
答案 1 :(得分:2)
“我得到了完全相同的结果”
只是因为您还不知道如何解释您的测试结果。
所有实例共享原型中的属性,但实例可以具有与原型具有相同名称的实例属性。
因此,当您说a.value = 13
时,您要在a
实例上创建属性,但原型value
属性仍为1
。
如果您改为MyClass.prototype.value = 13
,即使您在更改原型的a.value
之后,您也会看到b.value
和13
报告value
创建a
和b
。