2013-01-23 65 views
5

我了解私有静态机制如何在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(); 
SedanCar.prototype.constructor = SedanCar; 

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

+4

什么是“在继承螺丝钉”呢?你想解决什么问题? – jfriend00

+1

不,它是一个封闭。 – adrian

回答

4

首先,JavaScript中没有“private static”这样的东西。你在这里使用的是一个简单的闭包,它由Immediately-Invoked Function Expression创建。

你的问题不太清楚,但我想你想计算创建的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父构造绑定到新创建的对象。父构造函数进行初始化,然后孩子分配工作。在你的例子中,父母会像你期望的那样增加计数器。

+0

谢谢。 Object.create对我来说是新鲜事物:/ –