日韩精品欧美激情国产一区_中文无码精品一区二区三区在线_岛国毛片AV在线无码不卡_亞洲歐美日韓精品在線_使劲操好爽好粗视频在线播放_日韩一区欧美二区_八戒八戒网影院在线观看神马_亚洲怡红院在线色网_av无码不卡亚洲电影_国产麻豆媒体MDX

JS對象繼承方式的幾種寫法

時間:2018-11-27 16:18:48 類型:JS/JQUERY
字號:    

JS對象繼承方式的主要幾種寫法如下:

一、對象冒充


其原理如下:構(gòu)造函數(shù)使用 this 關(guān)鍵字給所有屬性和方法賦值(即采用類聲明的構(gòu)造函數(shù)方式)。因為構(gòu)造函數(shù)只是一個函數(shù),所以可使 Parent 構(gòu)造函數(shù) 成為 Children 的方法,然后調(diào)用它。Children 就會收到 Parent 的構(gòu)造函數(shù)中定義的屬性和方法。例如,用下面的方式定義 Parent 和 Children:

原理:就是把 Parent 構(gòu)造函數(shù)放到 Children 構(gòu)造函數(shù)里面執(zhí)行一次。那為什么不直接執(zhí)行,非要轉(zhuǎn)個彎把 Parent 賦值給 Children 的 method 屬性再執(zhí)行呢? 這跟 this 的指向有關(guān),在函數(shù)內(nèi) this 是指向 window 的。當將 Parent 賦值給 Children 的 method 時, this 就指向了 Children 類的實例。


二、原型鏈繼承


眾所周知,JavaScript 是一門基于原型的語言,在 JavaScript 中 prototype 對象的任何屬性和方法都被傳遞給那個類的所有實例。原型鏈利用這種功能來實現(xiàn)繼承機制:

注意:調(diào)用 Parent 的構(gòu)造函數(shù),沒有給它傳遞參數(shù)。這在原型鏈中是標準做法。要確保構(gòu)造函數(shù)沒有任何參數(shù)。


三、使用 call 或 applay 方法


這個方法是與對象冒充方法最相似的方法,因為它也是通過改變了 this 的指向而實現(xiàn)繼承:

四、混合方式


對象冒充的主要問題是必須使用構(gòu)造函數(shù)方式,這不是最好的選擇。不過如果使用原型鏈,就無法使用帶參數(shù)的構(gòu)造函數(shù)了。如何選擇呢?答案很簡單,兩者都用。 在 JavaScript 中創(chuàng)建類的最好方式是用構(gòu)造函數(shù)定義屬性,用原型定義方法。這種方式同樣適用于繼承機制:

五、使用 Object.create 方法


Object.create 方法會使用指定的原型對象及其屬性去創(chuàng)建一個新的對象:

@ 當執(zhí)行 Children.prototype = Object.create(Parent.prototype) 這個語句后,Children 的 constructor 就被改變?yōu)?Parent ,因此需要將 Children.prototype.constructor 重 新指定為 Children 自身。


六、extends 關(guān)鍵字實現(xiàn)繼承


這個是 ES6 的語法糖,下面看下es6實現(xiàn)繼承的方法:

上面代碼中,子類的constructor方法沒有調(diào)用super之前,就使用this關(guān)鍵字,結(jié)果報錯,而放在super方法之后就是正確的。子類Children的構(gòu)造函數(shù)之中的super(),代表調(diào)用父類Parent的構(gòu)造函數(shù)。這是必須的,否則 JavaScript 引擎會報錯。


注意,super雖然代表了父類Parent的構(gòu)造函數(shù),但是返回的是子類Children的實例,即super內(nèi)部的this指的是Children,因此super()在這里相當于Parent.prototype.constructor.call(this)。


南昌雅騰教育專注南昌php培訓和web前端技術(shù)培訓,小班現(xiàn)場授課,手把手教,主要學員的理論與企業(yè)項目的結(jié)合實戰(zhàn)培養(yǎng)。