有好消息,這裏有壞消息。壞消息是類和繼承的概念,因爲你不知道它來自其他語言。好消息是,JavaScript試圖沿着這個想法做一些事情(儘管它做了一個可憐的工作來實現它)。以下是您使用JavaScript提供的代碼示例:
function BaseResponse(success, errorMessage) {
this.success = success;
this.errorMessage = errorMessage;
}
function MovieResponse(success, errorMessage, movieId, movieName) {
BaseResponse.call(this, success, errorMessage); // Call the base class's constructor (if necessary)
this.movieId = movieId;
this.movieName = movieName;
}
MovieResponse.prototype = Object.create(BaseResponse);
MovieResponse.prototype.constructor = MovieResponse;
/**
* This is an example of an instance method.
*/
MovieResponse.prototype.instanceMethod = function(data) { /*...*/ };
/**
* This is an example of a static method. Notice the lack of prototype.
*/
MovieResponse.staticMethod = function(data) {/* ... */ };
// Instantiate a MovieResponse
var movieResInstance = new MovieResponse();
Mozilla的確很好documentation on JavaScript and classes。在上面的代碼中,您正在創建兩個功能BaseResponse
和MovieResponse
。當您使用new
關鍵字時,這兩個函數都會用作具有適當「類」的對象的構造函數。您指定MovieResponse
繼承自BaseMovie
與MovieResponse.prototype =
Object.create(BaseResponse)
。這有效地設置了MovieResponse
的prototype chain等於BaseResponse
的原型鏈。你會注意到在設置了MovieResponse
的原型鏈後,我必須將其構造函數設置爲指向MovieResponse
。如果我沒有這樣做,每次你嘗試初始化一個MovieResponse
,JavaScript都會嘗試去實例化一個BaseResponse
(我告訴你他們做了一件很糟糕的工作)。
其餘的代碼應該是相對簡單的。通過在原型鏈上定義它們,您可以在全新的閃亮類中創建實例方法。如果您在BaseResponse
上定義的功能未在MovieResponse
上定義,但在MovieResponse
的實例上調用該功能,則JavaScript將「抓取」原型鏈直到找到該功能。靜態方法直接在構造函數本身上定義(另一個奇怪的特性)。
注意沒有類型或訪問修飾符(公/私)的概念。你可以實現一些運行時技巧來實施類型,但是在JavaScript中通常是不必要的,而且更容易出錯和缺乏靈活性,而不是增加這些檢查就足夠了。
您可以使用比類型更直接的方法實現類的私有和受保護成員的概念。使用Node's require()
,並假設你想叫一個私有函數privateMethod
你可以實現它:
function privateMethod() { /* privateMethod definition */ }
// Definition for MovieResponse's constructor
function MovieResponse() { /*...*/ }
module.exports = MovieResponse;
我添了幾分需要評論,我不同意:無需在JavaScript中使用繼承。 JavaScript使用了一個名爲「duck typing」的概念(如果它看起來像一隻鴨子,聽起來像一隻鴨子,它的鴨子)。由於JavaScript是弱類型的,它不關心對象是BaseResponse還是MovieResponse,你可以調用任何方法或嘗試訪問你想要的任何字段。結果通常是錯誤或錯誤/容易出錯的代碼。我在這裏提到這個,因爲你可能會遇到這個概念及其支持者。知道這樣的編程是危險的,並導致不良編程實踐。
你問是否可以創建類並使用繼承,或者你問是否可以用mssql做到這一點?這些是兩個不同的問題,可能有不同的答案。 – c1moore
如何在nodejs中創建模型,並且也考慮繼承。 –
用戶[sequelize.js](http://docs.sequelizejs.com/en/v3/)ORM – SpunkyLive