0

foo1foo2从人那里继承。为什么是foo1.a一样的foo2.a

    var foo1, foo2;

    var person = function(a) {
        this.a = []
        this.b = 1;
        console.log('construct 1');
    }

    var kevin = function(a, b) {
        console.log('construct 2');
    }

    kevin.prototype = new person();

    foo1 = new kevin();
    foo2 = new kevin();

    foo1.a[3] = true;
    foo1.a[1] = true;
    foo2.a[1] = false;
    foo1.b = 2;
    foo2.b = 3;
    console.log(foo1.a);
    console.log(foo1.b);
    console.log(foo2.a);
    console.log(foo2.b);

为什么是foo*.a共享的?为什么不foo*.b共享?

4

2 回答 2

0

尝试:

function kevin( a, b ){
    Person.call( this, a );
    this.b = b;
    //do extra kevin stuff here...

}

您需要调用超级构造函数。也许这篇文章也会给你一些如何实现继承的想法。

于 2012-11-22T09:18:41.447 回答
0

对象(包括数组)存储为引用。基元(包括数字)存储为值。

new person()创建一个新人,并引用一个空数组。您将此对象(不是类,对象!)分配为kevin.

foo1.a不存在,所以a查找原型链,在这里我们找到了之前找到的空数组。当我们修改这个数组的内容时,我们仍然有 undefined foo1.a。您更改了数组内容,但没有更改引用的值(不是在原型上,当然也不是在 上foo1)。

foo2.a也不存在,因此a再次在原型上查找 - 找到与之前完全相同的数组(现在包含我们通过 访问它时的一些更改foo1)。

相反,foo1.b = ...将在 上定义一个新值foo1。下一次查找b不会沿着原型链向上传播。除此之外,数字无法更改,只能被覆盖,因此您无法进入内容更改而身份不变的情况,例如对象。

所以 - 你在这里有两种不同的现象,它们都是你所询问的那种行为的常见嫌疑人。在这里,具体来说,原型继承是罪魁祸首,但这只发生在 JavaScript 和类似的语言中(其中并不多)。在大多数其他情况下,类似的问题是由参考/值的区别引起的。

于 2012-11-22T09:26:34.980 回答