理解Javascript';s OOP:实例修改其他实例

理解Javascript';s OOP:实例修改其他实例,javascript,oop,prototype,Javascript,Oop,Prototype,我很难理解为什么修改实例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 pro

我很难理解为什么修改实例
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关键字不应该使
数据
变量成为实例变量吗

在本例中,情况似乎并非如此,本例按预期执行:

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

我不明白为什么原型方法不起作用。也许我缺乏一些概念知识。

a
b
有相同的原型。因此,它们的原型具有相同的属性。这就是它们之间的区别。

js中的Prototype是该类的所有实例之间共享的数据,它类似于经典oop语言中的静态变量。有时,在.prototype中放入一些方法/字段以在运行时节省内存是很有用的。

因为它确实做到了这一点:

var A = function (){

};

var someObj = { value:0 };

A.prototype.data = someObj;
因此,现在的所有实例都有一个名为
data
的属性,该属性指向对象
someObj
。在所有实例中,这都是相同的对象。您正在更改该对象内的

A
不拥有
。它保存对拥有
值的对象的引用

prototype关键字不应该使数据变量成为实例变量吗


事实恰恰相反。
A.prototype
A
创建的所有对象共享。为
A
创建的对象编制索引时,如果索引不存在,JavaScript将尝试通过对象的原型(例如
o.constructor.prototype
)解析该索引。在本例中,您使用
数据对
a
b
进行索引,这些数据在这些对象中不存在,因此它使用它们的原型中的数据。

。原型在所有实例之间共享。JavaScript是一种原型语言,它比经典的OO语言更通用。我很好的总结是 . 您还可以了解一下,这是一种更“纯”的原型语言,可能有助于更好地理解JavaScript