首先,JavaScript 中没有“私有静态”之类的东西。您在这里使用的是一个简单的闭包,它由立即调用函数表达式创建。
您的问题不太清楚,但我想您想计算创建的 Car 实例,但它不起作用,因为当您实例化子类时,计数器不会增加(问题 1)。相反,当您定义子类时,计数器只增加一次(问题 2)。
由于 JavaScript 具有基于原型的继承模型,因此您必须创建一个可以用作原型的对象。但我建议你不要调用父类的构造函数(这将解决问题的第二部分)。这是一种在 JavaScript 世界中随处使用的非常常见的模式(请参阅Simple JavaScript Inheritance、Backbone、CoffeScript等),如果您不需要支持非常旧的浏览器 (IE6-8),那么实现起来非常简单。它是这样的:
SedanCar.prototype = Object.create(Car.prototype)
现在问题的第一部分很容易解决。每次实例化孩子时只需调用父构造函数。这也是一个相当不错的模式,并且它内置于许多其他语言(Java 等)中。在 JavaScript 中,您必须手动完成,如下所示:
var SedanCar = function () {
// Parent class initialization
Car.call(this /*, and, other, arguments, to, the, parent, constructor */)
// Child class initialization
};
这将调用this
绑定到新创建对象的父构造函数。父构造函数进行初始化,然后子构造函数分担工作。在您的示例中,父级将按照您的预期增加计数器。