JavaScript和继承中的私有静态

JavaScript和继承中的私有静态,javascript,Javascript,我了解私有静态机制在javascript中的工作原理;但那会影响到你 遗产 例如: var Car = (function() { var priv_static_count = 0; return function() { priv_static_count = priv_static_count + 1; } })(); var SedanCar = function () {}; SedanCar.prototype = new Car();

我了解私有静态机制在javascript中的工作原理;但那会影响到你 遗产 例如:

var Car = (function() {
    var priv_static_count = 0;
    return function() {
        priv_static_count = priv_static_count + 1;   
    }
})();
var SedanCar = function () {};
SedanCar.prototype = new Car();
SedanCar.prototype.constructor = SedanCar;

有没有办法避免这个陷阱?

首先,JavaScript中没有“私有静态”这样的东西。这里使用的是一个简单的闭包,由

您的问题不太清楚,但我想您应该计算已创建的Car实例,但它不起作用,因为当您实例化子类时,计数器不会递增(问题1)。相反,当您定义子类时,计数器只增加一次(问题2)

因为JavaScript有一个基于原型的继承模型,所以必须创建一个可以用作原型的对象。但我建议您在不调用父类的构造函数的情况下执行此操作(这将解决问题的第二部分)。这是JavaScript世界中随处使用的一种非常常见的模式(请参见、等),如果不需要支持非常旧的浏览器(IE6-8),那么实现起来非常简单。事情是这样的:

SedanCar.prototype = Object.create(Car.prototype)
var SedanCar = function () {
    // Parent class initialization
    Car.call(this /*, and, other, arguments, to, the, parent, constructor */)

    // Child class initialization
};
现在问题的第一部分很容易解决。只要在每次实例化子构造函数时调用父构造函数即可。这也是一个非常好的模式,它内置于许多其他语言(Java等)中。在JavaScript中,您必须手动执行此操作,如下所示:

SedanCar.prototype = Object.create(Car.prototype)
var SedanCar = function () {
    // Parent class initialization
    Car.call(this /*, and, other, arguments, to, the, parent, constructor */)

    // Child class initialization
};
这将调用父构造函数,并将
This
绑定到新创建的对象。父构造函数进行初始化,然后子构造函数完成它的部分工作。在您的示例中,父级将按预期增加计数器。

继承中的螺丝钉是什么意思?你想解决的问题是什么?