最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談nodejs中的類定義和繼承的套路

 更新時間:2017年07月26日 09:56:14   作者:隨風(fēng)而行之青衫磊落險峰行  
本篇文章主要介紹了淺談nodejs中的類定義和繼承的套路,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

javascript是一門極其靈活的語言。

靈活到你無法忍受!

我個人喜歡強類型的語言,例如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這個函數(shù)調(diào)用時沒有使用new操作符,則會自動調(diào)用new操作符,返回Base的實例

套路2. 所有成員變量定義在構(gòu)造函數(shù)(constructor)中

function Base() {
  if (!(this instanceof Base)) {
    return new Base();
  }

  //開始成員變量定義
  this.className = "Base";
}

套路3. 所有的成員方法以函數(shù)表達式方式定義在原型(prototype)中【為什么要這樣,其原因在套路4中的inherits源碼注釋中】

Base.prototype.printClassName = function(){
   console.log(this.className);
}

調(diào)用如下:

var base = Base(); //不使用new操作符,直接進行函數(shù)調(diào)用,自動調(diào)用new操作符
console.log(base.className);
base.printClassName();

套路4. 使用util.inherits(子類,父類)進行原型(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');

  //要點: 如果要繼承的話,父類必須要有prototype對象
  //這也是為什么將所有成員方法都定義在prototype對象中?。?!
  if (superCtor.prototype === undefined)
    throw new TypeError('The super constructor to "inherits" must ' +
      'have a prototype');

  //讓子類構(gòu)造函數(shù)對象增加一個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ù)進行原型繼承

//注意,inherits調(diào)用不在構(gòu)造函數(shù),也不在原型對象,而是全局調(diào)用
inherits(Child, Base);

最后我們調(diào)用一下child的printClassName方法,該方法在基類原型對象中實現(xiàn)。

子類調(diào)用基類函數(shù)-undefined.png

出現(xiàn)錯誤,child.printClassName()后輸出undefined!

為什么呢?

套路5. 子類的構(gòu)造函數(shù)中使用 父類.call(this),實現(xiàn)父類構(gòu)造函數(shù)中的成員變量繼承

function Child() {
  //老樣子,套路1
  if (!(this instanceof Child)) {
    return new Child();
  }

  //增加這句話,在調(diào)用printClassName就能正常的輸出Base字符串
  Base.call(this);

  //如果要更新基類的成員變量,請在Base.call(this)之后!
  this._className = "Child"; //調(diào)用printClassName就能正常的輸出Child字符串
}

Function.prototype.call()

由此可見,nodejs中的繼承需要:

在構(gòu)造函數(shù)中調(diào)用 父類.call(this),實現(xiàn)父類成員變量的繼承

全局調(diào)用inherits(子類,父類) 進行父類成員函數(shù)的繼承

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • nodejs制作一個文檔同步工具自動同步到gitee中的實現(xiàn)代碼

    nodejs制作一個文檔同步工具自動同步到gitee中的實現(xiàn)代碼

    這篇文章主要介紹了nodejs制作一個文檔同步工具自動同步到gitee中,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • Node.js中的async?和?await?關(guān)鍵字微任務(wù)和宏任務(wù)

    Node.js中的async?和?await?關(guān)鍵字微任務(wù)和宏任務(wù)

    這篇文章主要介紹了Node.js中的async和await關(guān)鍵字微任務(wù)和宏任務(wù),文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07
  • Node.js接入DeepSeek實現(xiàn)流式對話功能

    Node.js接入DeepSeek實現(xiàn)流式對話功能

    隨著人工智能技術(shù)的發(fā)展,越來越多的服務(wù)和應(yīng)用開始集成AI能力以提升用戶體驗,本文將介紹如何通過Node.js接入DeepSeek提供的API服務(wù),特別是其聊天完成(Chat?Completions)功能,為您的應(yīng)用增添智能對話能力,需要的朋友可以參考下
    2025-02-02
  • node進程管理工具PM2用法詳解

    node進程管理工具PM2用法詳解

    本文詳細講解了node進程管理工具PM2的用法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 輕松創(chuàng)建nodejs服務(wù)器(7):阻塞操作的實現(xiàn)

    輕松創(chuàng)建nodejs服務(wù)器(7):阻塞操作的實現(xiàn)

    這篇文章主要介紹了輕松創(chuàng)建nodejs服務(wù)器(7):阻塞操作的實現(xiàn),本文先是組出了代碼,然后對代碼一一分析,需要的朋友可以參考下
    2014-12-12
  • NodeJs的優(yōu)勢和適合開發(fā)的程序

    NodeJs的優(yōu)勢和適合開發(fā)的程序

    做頁游或webqq這樣的應(yīng)用nodejs有優(yōu)勢,但如果做微博、豆瓣、facebook這樣的社交網(wǎng)絡(luò),nodejs還有優(yōu)勢嗎?另外不知道大家是什么原因選擇的nodejs?是因為應(yīng)用需求還是對javascript這門語言的喜歡?
    2016-08-08
  • 基于Express實現(xiàn)遞歸遍歷文件和CRUD操作

    基于Express實現(xiàn)遞歸遍歷文件和CRUD操作

    在現(xiàn)代的?Web?應(yīng)用開發(fā)中,文件管理是一個常見而重要的需求,所以本文就來講講如何利用?Express?框架,在遞歸遍歷文件之后實現(xiàn)強大的?CRUD?操作,構(gòu)建一個功能完善的文件管理系統(tǒng),感興趣的可以了解一下
    2023-06-06
  • Node.js中使用jQuery的做法

    Node.js中使用jQuery的做法

    在Node.js中使用jQuery的做法,需要先安裝jquery,npm install jquery ,安裝后的版本是 3.1.0,本文介紹的非常詳細,具有參考借鑒價值,感興趣的朋友一起看下吧
    2016-08-08
  • 淺談Node.js輕量級Web框架Express4.x使用指南

    淺談Node.js輕量級Web框架Express4.x使用指南

    本篇文章主要介紹了淺談Node.js輕量級Web框架Express4.x使用指南,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • node.js+postman+mongodb搭建測試注冊接口的實現(xiàn)

    node.js+postman+mongodb搭建測試注冊接口的實現(xiàn)

    本文主要介紹了node.js+postman+mongodb搭建測試注冊接口的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06

最新評論

姜堰市| 黄冈市| 阜康市| 临海市| 琼结县| 三穗县| 岳池县| 会昌县| 鄢陵县| 利辛县| 安新县| 黄龙县| 宁化县| 大渡口区| 清远市| 浙江省| 无极县| 临清市| 容城县| 高州市| 左云县| 德格县| 内丘县| 文成县| 蒙阴县| 济阳县| 勐海县| 湄潭县| 汶川县| 重庆市| 泸西县| 东兰县| 湘乡市| 蒲江县| 资兴市| 香格里拉县| 枝江市| 金寨县| 土默特右旗| 晋江市| 鹤峰县|