2013-01-23 100 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對我來說是新鮮事物:/ –