欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談nodejs中的類(lèi)定義和繼承的套路

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

javascript是一門(mén)極其靈活的語(yǔ)言。

靈活到你無(wú)法忍受!

我個(gè)人喜歡強(qiáng)類(lèi)型的語(yǔ)言,例如c/c++,c#等。

但是js代表著未來(lái),所以需要學(xué)習(xí)。

js中類(lèi)定義以及繼承有n多種方式,現(xiàn)在來(lái)學(xué)習(xí)一下nodejs類(lèi)定義以及繼承的固定套路。

套路1. 在構(gòu)造函數(shù)(constructor)中總是使用instanceof操作符:

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

上述代碼的含義就是: 如果Base這個(gè)函數(shù)調(diào)用時(shí)沒(méi)有使用new操作符,則會(huì)自動(dòng)調(diào)用new操作符,返回Base的實(shí)例

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

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

  //開(kāi)始成員變量定義
  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(子類(lèi),父類(lèi))進(jìn)行原型(prototype)繼承

先來(lái)看一下inherits的源碼:

var inherits = function(ctor, superCtor) {
  //嚴(yán)格相等測(cè)試:undefined/null
  //子類(lèi)構(gòu)造函數(shù)必須存在
  if (ctor === undefined || ctor === null)
    throw new TypeError('The constructor to "inherits" must not be ' +
      'null or undefined');
  //嚴(yán)格相等測(cè)試:undefined/null
  //父類(lèi)構(gòu)造函數(shù)必須存在
  if (superCtor === undefined || superCtor === null)
    throw new TypeError('The super constructor to "inherits" must not ' +
      'be null or undefined');

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

  //讓子類(lèi)構(gòu)造函數(shù)對(duì)象增加一個(gè)super_指針,指向父類(lèi),這樣就形成繼承鏈
  ctor.super_ = superCtor;

  //調(diào)用Object.setPrototypeOf(子類(lèi)的prototype,父類(lèi)的prototype)
  Object.setPrototypeOf(ctor.prototype, superCtor.prototype);
};

Object.setPrototypeOf : 該鏈接可以了解一下setPrototypeOf方法,非常簡(jiǎn)單,其Polyfill如下:

// 僅適用于Chrome和FireFox,在IE中不工作:
Object.setPrototypeOf = Object.setPrototypeOf || function (obj, proto) {
 obj.__proto__ = proto;
 return obj; 
}

我們來(lái)測(cè)試一下繼承。

先定義子類(lèi)

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方法,該方法在基類(lèi)原型對(duì)象中實(shí)現(xiàn)。

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

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

為什么呢?

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

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

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

  //如果要更新基類(lèi)的成員變量,請(qǐng)?jiān)贐ase.call(this)之后!
  this._className = "Child"; //調(diào)用printClassName就能正常的輸出Child字符串
}

Function.prototype.call()

由此可見(jiàn),nodejs中的繼承需要:

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

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

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

相關(guān)文章

  • node.js中的fs.lstatSync方法使用說(shuō)明

    node.js中的fs.lstatSync方法使用說(shuō)明

    這篇文章主要介紹了node.js中的fs.lstatSync方法使用說(shuō)明,本文介紹了fs.lstatSync的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 使用基于Node.js的構(gòu)建工具Grunt來(lái)發(fā)布ASP.NET MVC項(xiàng)目

    使用基于Node.js的構(gòu)建工具Grunt來(lái)發(fā)布ASP.NET MVC項(xiàng)目

    這篇文章主要介紹了使用基于Node.js的構(gòu)建工具Grunt來(lái)發(fā)布ASP.NET MVC項(xiàng)目的教程,自動(dòng)化構(gòu)建工具Grunt具有編譯壓縮單元測(cè)試等功能,十分強(qiáng)大,需要的朋友可以參考下
    2016-02-02
  • Node爬蟲(chóng)工具Puppeteer入門(mén)教程實(shí)踐

    Node爬蟲(chóng)工具Puppeteer入門(mén)教程實(shí)踐

    Puppeteer是一個(gè)Node庫(kù),本文主要介紹了Node爬蟲(chóng)工具Puppeteer入門(mén)教程實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • node.js中的fs.fsyncSync方法使用說(shuō)明

    node.js中的fs.fsyncSync方法使用說(shuō)明

    這篇文章主要介紹了node.js中的fs.fsyncSync方法使用說(shuō)明,本文介紹了fs.fsyncSync的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • NodeJS學(xué)習(xí)筆記之FS文件模塊

    NodeJS學(xué)習(xí)筆記之FS文件模塊

    在看nodejs介紹的過(guò)程中,nodejs對(duì)自己的異步I/O是重點(diǎn)突出的說(shuō)明的。在fs模塊中,nodejs提供了異步和同步兩種讀寫(xiě)方式
    2015-01-01
  • express框架中使用jwt實(shí)現(xiàn)驗(yàn)證的方法

    express框架中使用jwt實(shí)現(xiàn)驗(yàn)證的方法

    這篇文章主要給大家介紹了關(guān)于express框架中使用jwt實(shí)現(xiàn)驗(yàn)證的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用express具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Node.js的Koa實(shí)現(xiàn)JWT用戶(hù)認(rèn)證方法

    Node.js的Koa實(shí)現(xiàn)JWT用戶(hù)認(rèn)證方法

    本篇文章主要介紹了Node.js的Koa實(shí)現(xiàn)JWT用戶(hù)認(rèn)證方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Nodejs--post的公式詳解

    Nodejs--post的公式詳解

    本篇文章主要介紹了Nodejs--post公式的相關(guān)知識(shí),具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-04-04
  • 初探nodeJS

    初探nodeJS

    本文主要介紹了nodeJS的基礎(chǔ)知識(shí)。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-01-01
  • Node.js中的模塊路徑解析規(guī)則和子模塊包

    Node.js中的模塊路徑解析規(guī)則和子模塊包

    NodeJS特性如事件驅(qū)動(dòng)、異步編程、無(wú)阻塞IO,這些特性為它帶來(lái)了高效的性能和更少的代碼,require函數(shù)支持斜杠(/)或盤(pán)符(C:)開(kāi)頭的絕對(duì)路徑,也支持./開(kāi)頭的相對(duì)路徑,為了便于管理和使用,我們可以把由多個(gè)子模塊組成的大模塊稱(chēng)做包,并把所有子模塊放在同一個(gè)目錄里
    2023-11-11

最新評(píng)論