JavaScript原型构造函数只调用一次

时间:2015-02-18 10:16:49

标签: javascript oop inheritance

我的javascript类原型构造函数只为我的所有实例调用一次,而不是每个实例调用一次。将唯一超级实例链接到子类的正确方法是什么?

使用下面的代码我希望输出,所有uniqueId都是唯一的:

Org {uniqueId: 4}
Org {uniqueId: 5}
Org {uniqueId: 6}
Sub {uniqueSubId: 1, uniqueId: 1}
Sub {uniqueSubId: 2, uniqueId: 2}
Sub {uniqueSubId: 3, uniqueId: 3}

然而,实际输出是所有Sub的uniqueId 1:

Org {uniqueId: 2}
Org {uniqueId: 3}
Org {uniqueId: 4}
Sub {uniqueSubId: 1, uniqueId: 1}
Sub {uniqueSubId: 2, uniqueId: 1}
Sub {uniqueSubId: 3, uniqueId: 1}

代码:     var OrgCounter = 0;

var Org = function() {
    this.uniqueId = ++OrgCounter;
}

var SubCounter = 0;
var Sub = function() {
    this.uniqueSubId = ++SubCounter;
}

Sub.prototype = new Org;

console.log(new Org());
console.log(new Org());
console.log(new Org());

console.log(new Sub());
console.log(new Sub());
console.log(new Sub());

JSFiddle

1 个答案:

答案 0 :(得分:1)

您不应该将Child.prototype设置为Parent实例;特别是如果你没有在Child中使用Parent构造函数(Parent.call(this,...))。这里都详细解释了:https://stackoverflow.com/a/16063711/1641941 和这里: https://stackoverflow.com/a/28574454/1641941

您应该使用Object.create:

设置子原型
Sub.prototype = Object.create(Org.prototype);