了解Javascript的OOP:修改其他实例的实例

时间:2010-12-27 20:58:52

标签: 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

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

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

5 个答案:

答案 0 :(得分:3)

因为它确实这样做了:

var A = function (){

};

var someObj = { value:0 };

A.prototype.data = someObj;

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

A不拥有value。它包含对拥有value的对象的引用。

答案 1 :(得分:1)

  

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

它恰恰相反。 A.prototypeA创建的所有对象共享。索引由A创建的对象时,如果索引不存在,JavaScript将尝试通过对象的原型(例如o.constructor.prototype)解析该索引。在这种情况下,您使用a索引bdata,这些对象中不存在,因此它使用原型中的那个。

答案 2 :(得分:0)

ab具有相同的原型。所以他们的原型共享属性。这是classical and prototypal inheritance之间的区别。

答案 3 :(得分:0)

js中的Prototype是该类的所有实例之间的数据 shared ,它就像来自经典oop语言的静态变量。有时,在.prototype中放置一些方法/字段以在运行时节省内存是有用的。

答案 4 :(得分:0)

恰恰相反。原型在所有实例之间共享。 JavaScript是一种原型语言,它比传统的OO语言更通用。我很好的总结是 Prototypal inheritance。您也可以稍微了解io language这是一种更“纯粹”的原型语言,可能有助于更好地理解JavaScript。