2012-07-22 85 views
1

我有兩個文件:BaseClass.js和DerivedClass.js。內容如下Javascript關閉和繼承

//---------------------BaseClass.js---------------------------- 

(function() { 
    BaseClass= function() { }; 
    BaseClass.prototype.getTestVar = function() { 
    return 'base test variable'; 
    }; 
})(); 


//----------------DerivedClass.js---------------------------- 

(function() { 
    DerivedClass= function() { }; 
    DerivedClass.inherits(BaseClass); 
    DerivedClass.prototype = new BaseClass(); 
    DerivedClass.prototype = { 
     newvar : 'derived func variable ', 
     getNewVar : function() { return this.newvar; } 
    }; 
})(); 

在我的HTML文件 '的test.html' 我有以下

var dc = new DerivedClass(); 
alert(
    'The value in newvar of derived class ' + dc.getNewVar() + 
    ' base class variable ' + dc.getTestVar() 
); 

我得到的JavaScript錯誤是dc.getTestVar()不是一個函數。 任何幫助解決這個問題都非常感謝。

+2

你使用某種OOP庫嗎? Javascript函數沒有內置的'inherits'方法,據我所知... – Matchu 2012-07-22 02:38:30

+0

哦,是不是[Crockford的OOP糖](http://www.crockford.com/javascript/inheritance.html#sugar)? – Matchu 2012-07-22 02:39:40

回答

2

查閱這些幾行:

DerivedClass.prototype = new BaseClass(); 
DerivedClass.prototype = { 
    newvar : 'derived func variable ', 
    getNewVar : function() { return this.newvar; } 
}; 

首先,它分配一個新的BaseClass爲原型,但隨後的下一行改寫該樣機與新對象。也許你需要分別分配DerivedClass.prototype.newvarDerivedClass.prototype.getNewVar--假設你使用的任何經典的繼承庫都符合這個規範,這就提供了inherits方法。

也就是說,

DerivedClass.prototype = new BaseClass(); 
DerivedClass.prototype.newvar = 'derived func variable'; 
DerivedClass.prototype.getNewVar = function() { return this.newvar; } 

不過,這似乎是古典與原型繼承的混合。考慮閱讀該經典繼承庫的文檔,看看是否有更一致的方法來做這種事情。

例如,如果你使用Crockford's classical inheritance(猜測從inherits關鍵字),這似乎是他的意圖的方式來聲明一個方法:

DerivedClass.method('getNewVar', function() { return this.newvar }); 

誠然,這相當於究竟什麼你已經在做,但是,如果我們要使用他的圖書館,不妨使用他的風格來保持一致性。

+0

我在同一時間回答完全相同的問題。願最幸運的人贏得勝利! – Hubro 2012-07-22 02:42:31

+0

哈哈,這很有趣;)+1讓你開始吧! – Matchu 2012-07-22 02:43:33

+1

你的一種:-)我急切地等待着我的5000. +1 – Hubro 2012-07-22 02:45:33

2

此時:

DerivedClass.prototype = new BaseClass(); 
DerivedClass.prototype = { 
    newvar : 'derived func variable ', 
    getNewVar : function() { return this.newvar; } 
}; 

你是第一個原型設置爲BaseClass,但隨後一個新的對象覆蓋它。試試這個:

DerivedClass.prototype = new BaseClass(); 
DerivedClass.prototype.newvar = 'derived func variable '; 
DerivedClass.prototype.getNewVar = function() { return this.newvar; };