2012-08-15 126 views
1

无论我使用“this.value = 1”,我都得到了完全相同的结果。在构造函数内部或者只是将属性值放入函数构造函数的原型中 - “MyClass.prototype.value = 1;”javascript原型的点究竟是什么

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,显然每个对象(A,B)得到它的价值自己的副本内它是自己的内存块 那么如果原型值不在对象之间共享,那么使用原型值究竟是什么?

+1

难道只是我,还是这个问题问的方式太多了? D: – 2012-08-15 02:15:22

回答

6

你的测试是似是而非的。原型值之间共享的值,但在写入a.value = 13时,您已经shadowedMyClass.prototype.value属性a。试试这个关于大小:

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

对象属性查找旅行了原型链,直到原型为空,或者指定名称的属性没有被找到。在原始测试a.value = 13导致在a.value上的查找以a结束 - 因为在该对象上有一个名为value的属性 - 在到达原型之前。

更多阅读:

+0

a.prototype.value = 13;不起作用 - “a.prototype未定义” – BlackRaider 2012-08-15 02:46:57

+0

哎呀,修正了。抱歉 – 2012-08-15 02:51:18

2

“我得到完全同样的结果”

只是因为你不还知道如何解释你的测试结果。

所有实例从原型共享属性,但实例可以具有与原型相同名称的实例属性。

所以,当你说a.value = 13要创建在a实例的属性,但原型value属性仍然1

如果你不是说MyClass.prototype.value = 13你会看到,无论a.valueb.value报告13即使改变原型的value创建ab