淺談nodejs中的類定義和繼承的套路
javascript是一門極其靈活的語言。
靈活到你無法忍受!
我個(gè)人喜歡強(qiáng)類型的語言,例如c/c++,c#等。
但是js代表著未來,所以需要學(xué)習(xí)。
js中類定義以及繼承有n多種方式,現(xiàn)在來學(xué)習(xí)一下nodejs類定義以及繼承的固定套路。
套路1. 在構(gòu)造函數(shù)(constructor)中總是使用instanceof操作符:
function Base() {
if (!(this instanceof Base)) {
return new Base();
}
}
上述代碼的含義就是: 如果Base這個(gè)函數(shù)調(diào)用時(shí)沒有使用new操作符,則會(huì)自動(dòng)調(diào)用new操作符,返回Base的實(shí)例
套路2. 所有成員變量定義在構(gòu)造函數(shù)(constructor)中
function Base() {
if (!(this instanceof Base)) {
return new Base();
}
//開始成員變量定義
this.className = "Base";
}
套路3. 所有的成員方法以函數(shù)表達(dá)式方式定義在原型(prototype)中【為什么要這樣,其原因在套路4中的inherits源碼注釋中】
Base.prototype.printClassName = function(){
console.log(this.className);
}
調(diào)用如下:
var base = Base(); //不使用new操作符,直接進(jìn)行函數(shù)調(diào)用,自動(dòng)調(diào)用new操作符 console.log(base.className); base.printClassName();
套路4. 使用util.inherits(子類,父類)進(jìn)行原型(prototype)繼承
先來看一下inherits的源碼:
var inherits = function(ctor, superCtor) {
//嚴(yán)格相等測試:undefined/null
//子類構(gòu)造函數(shù)必須存在
if (ctor === undefined || ctor === null)
throw new TypeError('The constructor to "inherits" must not be ' +
'null or undefined');
//嚴(yán)格相等測試:undefined/null
//父類構(gòu)造函數(shù)必須存在
if (superCtor === undefined || superCtor === null)
throw new TypeError('The super constructor to "inherits" must not ' +
'be null or undefined');
//要點(diǎn): 如果要繼承的話,父類必須要有prototype對(duì)象
//這也是為什么將所有成員方法都定義在prototype對(duì)象中?。?!
if (superCtor.prototype === undefined)
throw new TypeError('The super constructor to "inherits" must ' +
'have a prototype');
//讓子類構(gòu)造函數(shù)對(duì)象增加一個(gè)super_指針,指向父類,這樣就形成繼承鏈
ctor.super_ = superCtor;
//調(diào)用Object.setPrototypeOf(子類的prototype,父類的prototype)
Object.setPrototypeOf(ctor.prototype, superCtor.prototype);
};
Object.setPrototypeOf : 該鏈接可以了解一下setPrototypeOf方法,非常簡單,其Polyfill如下:
// 僅適用于Chrome和FireFox,在IE中不工作:
Object.setPrototypeOf = Object.setPrototypeOf || function (obj, proto) {
obj.__proto__ = proto;
return obj;
}
我們來測試一下繼承。
先定義子類
function Child() {
//老樣子,套路1
if (!(this instanceof Child)) {
return new Child();
}
}
然后根據(jù)套路4, 調(diào)用inherits函數(shù)進(jìn)行原型繼承
//注意,inherits調(diào)用不在構(gòu)造函數(shù),也不在原型對(duì)象,而是全局調(diào)用 inherits(Child, Base);
最后我們調(diào)用一下child的printClassName方法,該方法在基類原型對(duì)象中實(shí)現(xiàn)。

子類調(diào)用基類函數(shù)-undefined.png
出現(xiàn)錯(cuò)誤,child.printClassName()后輸出undefined!
為什么呢?
套路5. 子類的構(gòu)造函數(shù)中使用 父類.call(this),實(shí)現(xiàn)父類構(gòu)造函數(shù)中的成員變量繼承
function Child() {
//老樣子,套路1
if (!(this instanceof Child)) {
return new Child();
}
//增加這句話,在調(diào)用printClassName就能正常的輸出Base字符串
Base.call(this);
//如果要更新基類的成員變量,請(qǐng)?jiān)贐ase.call(this)之后!
this._className = "Child"; //調(diào)用printClassName就能正常的輸出Child字符串
}
由此可見,nodejs中的繼承需要:
在構(gòu)造函數(shù)中調(diào)用 父類.call(this),實(shí)現(xiàn)父類成員變量的繼承
全局調(diào)用inherits(子類,父類) 進(jìn)行父類成員函數(shù)的繼承
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
nodejs制作一個(gè)文檔同步工具自動(dòng)同步到gitee中的實(shí)現(xiàn)代碼
這篇文章主要介紹了nodejs制作一個(gè)文檔同步工具自動(dòng)同步到gitee中,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12
Node.js中的async?和?await?關(guān)鍵字微任務(wù)和宏任務(wù)
這篇文章主要介紹了Node.js中的async和await關(guān)鍵字微任務(wù)和宏任務(wù),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-07-07
Node.js接入DeepSeek實(shí)現(xiàn)流式對(duì)話功能
隨著人工智能技術(shù)的發(fā)展,越來越多的服務(wù)和應(yīng)用開始集成AI能力以提升用戶體驗(yàn),本文將介紹如何通過Node.js接入DeepSeek提供的API服務(wù),特別是其聊天完成(Chat?Completions)功能,為您的應(yīng)用增添智能對(duì)話能力,需要的朋友可以參考下2025-02-02
輕松創(chuàng)建nodejs服務(wù)器(7):阻塞操作的實(shí)現(xiàn)
這篇文章主要介紹了輕松創(chuàng)建nodejs服務(wù)器(7):阻塞操作的實(shí)現(xiàn),本文先是組出了代碼,然后對(duì)代碼一一分析,需要的朋友可以參考下2014-12-12
基于Express實(shí)現(xiàn)遞歸遍歷文件和CRUD操作
在現(xiàn)代的?Web?應(yīng)用開發(fā)中,文件管理是一個(gè)常見而重要的需求,所以本文就來講講如何利用?Express?框架,在遞歸遍歷文件之后實(shí)現(xiàn)強(qiáng)大的?CRUD?操作,構(gòu)建一個(gè)功能完善的文件管理系統(tǒng),感興趣的可以了解一下2023-06-06
淺談Node.js輕量級(jí)Web框架Express4.x使用指南
本篇文章主要介紹了淺談Node.js輕量級(jí)Web框架Express4.x使用指南,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05
node.js+postman+mongodb搭建測試注冊(cè)接口的實(shí)現(xiàn)
本文主要介紹了node.js+postman+mongodb搭建測試注冊(cè)接口的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06

