究竟什么是javascript原型的重点

时间:2012-08-15 02:04:42

标签: javascript prototype

我使用“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)都在它自己的内存块中获得它自己的值副本 那么,如果原型值不在对象之间共享,究竟是什么原因?

2 个答案:

答案 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.value13报告value 创建ab