我試圖在JavaScript中實現某種類的層次結構。 I 認爲我理解了原型鏈,但我仍然必須理清構造函數鏈的 。繼大衛·弗拉納根的Definitive Guide, 我寫JavaScript中的鏈接構造函數
function DerivedClass()
{
BaseClass.apply(this, arguments); // chain constructors
// do some initializations specific to DerivedClass...
}
var foo = new DerivedClass();
其中BaseClass()
是用C寫的我的本地函數++(我 使用QtScript)。我的問題是,那麼,BaseClass()
被稱爲 作爲一個函數,而不是一個構造函數。
我可以編碼BaseClass()
始終表現爲構造函數,但它調用 。但恐怕我的一些用戶一天一個可能會忘記new
和只寫
var bar = BaseClass();
在這種情況下,我想BaseClass()
做一些更 不是初始化的全局對象明智的。例如:
if (!context->isCalledAsConstructor()) fail_gracefully();
但是然後構造函數鏈失敗!
有沒有辦法鏈接構造函數並讓BaseClass()
實際上被稱爲構造函數?或者我應該教育我的用戶 永遠不會忘記new
?現在我很想通過更換上述 測試:
if (context->thisObject().strictlyEquals(engine->globalObject()))
fail_gracefully();
,但我不知道是否有處理這種更清潔的方式。
謝謝!
嗯,從技術上講,我可以通過拋出一個異常來保護它們,或者忽略'this'並返回一個全新的對象(比如'Array()')。我的問題是,第一個選項干擾構造函數鏈,而第二個選項與原型鏈不兼容。 – 2010-10-21 12:54:40