0

說我有一個抽象類如何在javascript中擴展一個抽象類,併爲閉包編譯器註釋但沒有閉包庫?

/**@constructor 
* @abstract*/ 
function AbsFoo(){} 

/**@return {number} 
* @param {number} a 
* @param {number} b */ 
AbsFoo.prototype.aPlusB = function(a,b){ 
    return a + b 
}; 

/**@abstract 
* @return {number} 
* @param {number} c 
* @param {number} d */ 
AbsFoo.prototype.cMinusD = function(c,d){}; //extending class need to implement. 

,我想擴展這個類,通常情況下,我會做類似

/**@constructor 
* @extends {AbsFoo} */ 
function Foo(){ 
    AbsFoo.apply(this); 
} 

Foo.prototype = new AbsFoo(); 
Foo.prototype.constructor = Foo; 

Foo.prototype.doSomething = function(c,d){ 
    return c - d; 
}; 

但關閉編譯器

JSC_INSTANTIATE_ABSTRACT_CLASS: cannot instantiate abstract class 

闖民宅說要該行Foo.prototype = new AbsFoo();

那麼如何ld我這樣做是爲了保持原型的繼承性,以及在整個類鏈上使用instanceof的能力,同時也讓編譯器感到高興?

回答

0

在這種情況下,我使用goog.inherits。由於您不想使用封閉庫,因此您可以從 closure-library/closure/goog/base.js複製goog.inherits。也許給它起個名字googInherits。代碼是這樣的:

/**@constructor 
* @extends {AbsFoo} 
*/ 
Foo = function(){ 
    AbsFoo.apply(this); 
} 
googInherits(Foo, AbsFoo); 

/** @inheritDoc */ 
Foo.prototype.cMinusD = function(c,d){ 
    return c - d; 
}; 
+0

如果你看看goog.inherits的代碼,我已經做了大部分的功能。 – Julian

+0

其實.....這個工程。我的意思是我做了一點不同,但它基本上是一樣的。但它似乎工作,因爲goog.inherits函數創建一個新的類,這是一個抽象類,就像父類和子類之間的橋樑。 bridge類是一個抽象類,但沒有註釋,因此編譯器在爲子類原型創建實例時不會給出警告.... ....我覺得可能@abstract註釋尚未處於穩定狀態。我很確定這是相當新的......無論如何,謝謝你的答案! – Julian

+0

Closure Compiler最近升級了對抽象類的處理,這是正確的。根據我的經驗,使用抽象類找到問題會更加一致,這就是您遇到的問題。 – owler

相關問題