我无法理解为什么修改实例a
中的属性会修改实例b
上的相同属性。
var A = function (){
};
A.prototype.data = {
value : 0
};
var a = new A();
var b = new A();
console.log(a.data.value, b.data.value); // 0, 0
a.data.value = 5;
console.log(a.data.value, b.data.value); // 5, 5
prototype关键字不应该使data
变量成为实例变量吗?
在这个按预期执行的示例中似乎并非如此:
var B = function (){
this.data = {
value : 0
};
};
var i = new B();
var j = new B();
console.log(i.data.value, j.data.value); // 0, 0
i.data.value = 5;
console.log(i.data.value, j.data.value); // 5, 0
我很困惑为什么原型方法不起作用。也许我缺乏一些概念知识。
答案 0 :(得分:3)
因为它确实这样做了:
var A = function (){
};
var someObj = { value:0 };
A.prototype.data = someObj;
因此,A的所有实例现在都有一个名为data
的属性,该属性指向对象someObj
。在所有实例中,这是同一个对象。而且您正在更改该对象内的value
。
A
不拥有value
。它包含对拥有value
的对象的引用。
答案 1 :(得分:1)
prototype关键字不应该使数据变量成为实例变量吗?
它恰恰相反。 A.prototype
由A
创建的所有对象共享。索引由A
创建的对象时,如果索引不存在,JavaScript将尝试通过对象的原型(例如o.constructor.prototype
)解析该索引。在这种情况下,您使用a
索引b
和data
,这些对象中不存在,因此它使用原型中的那个。
答案 2 :(得分:0)
a
和b
具有相同的原型。所以他们的原型共享属性。这是classical and prototypal inheritance之间的区别。
答案 3 :(得分:0)
js中的Prototype是该类的所有实例之间的数据 shared ,它就像来自经典oop语言的静态变量。有时,在.prototype中放置一些方法/字段以在运行时节省内存是有用的。
答案 4 :(得分:0)
恰恰相反。原型在所有实例之间共享。 JavaScript是一种原型语言,它比传统的OO语言更通用。我很好的总结是 Prototypal inheritance。您也可以稍微了解io language这是一种更“纯粹”的原型语言,可能有助于更好地理解JavaScript。