5

(我是 JavaScript 新手)。以下代码:

function A() {
    console.log('Constructing A');
    this.a = new Array();
}
function B(x) {
    console.log('Constructing B');
    this.a.push(x);
    this.b = x;
}
B.prototype = new A();
b1 = new B(10);
b2 = new B(11);
console.log('b1', b1);
console.log('b2', b2);​

结果 b1 和 b2 共享单个 this.a 数组(但不同 this.b)。这就像一个浅拷贝。

我不太明白创建单独 this.a数组的正确方法是什么。我希望它们继承,因为这是代码的逻辑,此外我不想在每个子对象中创建它们(在我的情况下有很多子对象)。

4

2 回答 2

3

I am very interested in the explanation of this problem. I've read @Niko`s duplicate question but it seems this is what makes the difference:

 function A() {
        console.log('Constructing A');
        this.a=new Array();
    }

    function B(x) {
        console.log('Constructing B');
        A.call(this); //--> calling the super() constructor creates a new array
        this.a.push(x);
    }

    B.prototype = new A();

    b1 = new B(11);
    b2 = new B(12);
    console.log(b1.a);
    console.log(b2.a);
于 2012-08-26T12:35:01.673 回答
0

在您的代码中:

> function A() {
>     console.log('Constructing A');
>     this.a = new Array();
> }
>
> function B(x) {
>     console.log('Constructing B');
>     this.a.push(x);
>     this.b = x;
> }
>
> B.prototype = new A();

这将 B 的原型设置为 A 的实例。因此 B 的所有实例都将在其[[Prototype]]链上具有该 A 的实例。

在 B 构造函数中,this引用了一个继承自 B.prototype 的新对象,因此this.a将引用 .prototype 的a属性B.prototype

> b1 = new B(10);

所以现在B.prototype.a[10]

> b2 = new B(11);

现在B.prototype.a[10, 11]

于 2012-08-26T13:21:10.100 回答