首先,JavaScript中沒有「private static」這樣的東西。你在這裏使用的是一個簡單的閉包,它由Immediately-Invoked Function Expression創建。
你的問題不太清楚,但我想你想計算創建的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
父構造綁定到新創建的對象。父構造函數進行初始化,然後孩子分配工作。在你的例子中,父母會像你期望的那樣增加計數器。
什麼是「在繼承螺絲釘」呢?你想解決什麼問題? – jfriend00
不,它是一個封閉。 – adrian