理解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