JavaScript原型的意义到底是什么

what exactly is the point of javascript prototype

本文关键字:是什么 原型 JavaScript      更新时间:2023-09-26

无论我在构造函数中使用"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) 都会在自己的内存块中获取自己的值副本那么,如果原型值不在对象之间共享,那么它们究竟有什么用呢?

你的测试是似是而非的。原型值在值之间共享,但在写入 a.value = 13 时,您已在 a 上隐藏了 MyClass.prototype.value 属性。试试这个尺寸:

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);

(演示)

对象属性查找沿原型链向上移动,直到原型为 null 或找到具有指定名称的属性。在原始测试中a.value = 13会导致对a.value的查找以a结尾 - 因为该对象上有一个名为value的属性 - 在到达原型之前。

更多阅读:

  • JavaScript .prototype 是如何工作的?
  • 继承和原型链

"我得到的结果完全一样"

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

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

因此,当您说a.value = 13时,您正在a实例上创建一个属性,但原型value属性仍然1

如果你说MyClass.prototype.value = 13你会看到a.valueb.value报告13,即使您在创建ab更改原型的value