5

我了解私有静态机制在 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;

有什么办法可以避免这个陷阱?

4

1 回答 1

4

首先,JavaScript 中没有“私有静态”之类的东西。您在这里使用的是一个简单的闭包,它由立即调用函数表达式创建。

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

由于 JavaScript 具有基于原型的继承模型,因此您必须创建一个可以用作原型的对象。但我建议你不要调用父类的构造函数(这将解决问题的第二部分)。这是一种在 JavaScript 世界中随处使用的非常常见的模式(请参阅Simple JavaScript InheritanceBackboneCoffeScript等),如果您不需要支持非常旧的浏览器 (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绑定到新创建对象的父构造函数。父构造函数进行初始化,然后子构造函数分担工作。在您的示例中,父级将按照您的预期增加计数器。

于 2013-01-23T13:25:24.600 回答