亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JS繼承之借用構(gòu)造函數(shù)繼承和組合繼承

 更新時(shí)間:2021年11月04日 15:57:05   投稿:lijiao  
這篇文章主要為大家詳細(xì)介紹了JS繼承之借用構(gòu)造函數(shù)繼承和組合繼承,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

借用構(gòu)造函數(shù)繼承

在解決原型中包含引用類型值所帶來問題的過程中,開發(fā)人員開始使用一種叫做借用構(gòu)造函數(shù)(constructor stealing)的技術(shù)(有時(shí)候也叫做偽造對(duì)象或經(jīng)典繼承)。這種技術(shù)的基本思想相當(dāng)簡(jiǎn)單,即在子類型構(gòu)造函數(shù)的內(nèi)部調(diào)用超類型構(gòu)造函數(shù)。

基本模式

function SuperType(){
 this.colors = ["red", "blue", "green"];
}
function SubType(){
  //繼承了SuperType
 SuperType.call(this);
}

var instance1 = new SubType();
instance1.colors.push("black");
alert(instance1.colors); //"red,blue,green,black"
var instance2 = new SubType();
alert(instance2.colors); //"red,blue,green" 

基本思想

借用構(gòu)造函數(shù)的基本思想就是利用call或者apply把父類中通過this指定的屬性和方法復(fù)制(借用)到子類創(chuàng)建的實(shí)例中。因?yàn)閠his對(duì)象是在運(yùn)行時(shí)基于函數(shù)的執(zhí)行環(huán)境綁定的。也就是說,在全局中,this等于window,而當(dāng)函數(shù)被作為某個(gè)對(duì)象的方法調(diào)用時(shí),this等于那個(gè)對(duì)象。call 、apply方法可以用來代替另一個(gè)對(duì)象調(diào)用一個(gè)方法。call、apply 方法可將一個(gè)函數(shù)的對(duì)象上下文從初始的上下文改變?yōu)橛?thisObj 指定的新對(duì)象。

所以,這個(gè)借用構(gòu)造函數(shù)就是,new對(duì)象的時(shí)候(注意,new操作符與直接調(diào)用是不同的,以函數(shù)的方式直接調(diào)用的時(shí)候,this指向window,new創(chuàng)建的時(shí)候,this指向創(chuàng)建的這個(gè)實(shí)例),創(chuàng)建了一個(gè)新的實(shí)例對(duì)象,并且執(zhí)行SubType里面的代碼,而SubType里面用call調(diào)用了SuperTyep,也就是說把this指向改成了指向新的實(shí)例,所以就會(huì)把SuperType里面的this相關(guān)屬性和方法賦值到新的實(shí)例上,而不是賦值到SupType上面。所有實(shí)例中就擁有了父類定義的這些this的屬性和方法。

優(yōu)勢(shì)

相對(duì)于原型鏈而言,借用構(gòu)造函數(shù)有一個(gè)很大的優(yōu)勢(shì),即可以在子類型構(gòu)造函數(shù)中向超類型構(gòu)造函數(shù)傳遞參數(shù)。因?yàn)閷傩允墙壎ǖ絫his上面的,所以調(diào)用的時(shí)候才賦到相應(yīng)的實(shí)例中,各個(gè)實(shí)例的值就不會(huì)互相影響了。

例如:

function SuperType(name){
this.name = name;
}
function SubType(){
//繼承了SuperType,同時(shí)還傳遞了參數(shù)
SuperType.call(this, "Nicholas");
//實(shí)例屬性
this.age = 29;
}
var instance = new SubType();
alert(instance.name); //"Nicholas";
alert(instance.age); //29 

劣勢(shì)

如果僅僅是借用構(gòu)造函數(shù),那么也將無法避免構(gòu)造函數(shù)模式存在的問題——方法都在構(gòu)造函數(shù)中定義,因此函數(shù)復(fù)用就無從談起了。而且,在超類型的原型中定義的方法,對(duì)子類型而言也是不可見的,結(jié)果所有類型都只能使用構(gòu)造函數(shù)模式??紤]到這些問題,借用構(gòu)造函數(shù)的技術(shù)也是很少單獨(dú)使用的。 

組合繼承

組合繼承(combination inheritance),有時(shí)候也叫做偽經(jīng)典繼承。是將原型鏈和借用構(gòu)造函數(shù)的技術(shù)組合到一塊,從而發(fā)揮二者之長(zhǎng)的一種繼承模式。/p>

基本思想

思路是使用原型鏈實(shí)現(xiàn)對(duì)原型屬性和方法的繼承,而通過借用構(gòu)造函數(shù)來實(shí)現(xiàn)對(duì)實(shí)例屬性的繼承。這樣,既通過在原型上定義方法實(shí)現(xiàn)了函數(shù)復(fù)用,又能夠保證每個(gè)實(shí)例都有它自己的屬性。

基本模型

function SuperType(name){
 this.name = name;
 this.colors = ["red", "blue", "green"];
}
SuperType.prototype.sayName = function(){
  alert(this.name);
};
function SubType(name, age){
//繼承屬性
 SuperType.call(this, name);
 this.age = age;
}
//繼承方法
SubType.prototype = new SuperType();
SubType.prototype.constructor = SubType;
SubType.prototype.sayAge = function(){
alert(this.age);
};
var instance1 = new SubType("Nicholas", 29);
instance1.colors.push("black");
alert(instance1.colors); //"red,blue,green,black"
instance1.sayName(); //"Nicholas";
instance1.sayAge(); //29
var instance2 = new SubType("Greg", 27);
alert(instance2.colors); //"red,blue,green"
instance2.sayName(); //"Greg";
instance2.sayAge(); //27 

優(yōu)勢(shì)

組合繼承避免了原型鏈和借用構(gòu)造函數(shù)的缺陷,融合了它們的優(yōu)點(diǎn),成為JavaScript 中最常用的繼承模式。

劣勢(shì)

組合繼承最大的問題就是無論什么情況下,都會(huì)調(diào)用兩次超類型構(gòu)造函數(shù):一次是在創(chuàng)建子類型原型的時(shí)候,另一次是在子類型構(gòu)造函數(shù)內(nèi)部。雖然子類型最終會(huì)包含超類型對(duì)象的全部實(shí)例屬性,但我們不得不在調(diào)用子類型構(gòu)造函數(shù)時(shí)重寫這些屬性。

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

相關(guān)文章

  • 基于Vue的ajax公共方法(詳解)

    基于Vue的ajax公共方法(詳解)

    下面小編就為大家分享一篇基于Vue的ajax公共方法(詳解),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • javascript奇異的arguments分析

    javascript奇異的arguments分析

    在 Javascript 的函數(shù)中有個(gè)名為 arguments 的類數(shù)組對(duì)象。它看起來是那么的詭異而且名不經(jīng)傳,但眾多的 Javascript 庫(kù)都使用著它強(qiáng)大的功能。所以,它的特性需要每個(gè) Javascript 程序員去熟悉它。
    2010-10-10
  • javascript用戶注冊(cè)提示效果的簡(jiǎn)單實(shí)例

    javascript用戶注冊(cè)提示效果的簡(jiǎn)單實(shí)例

    這個(gè)可以增加用戶驗(yàn)證,不用js alert來作提示,而是在右邊提示,現(xiàn)在很多網(wǎng)站都這樣做,有需要的朋友可以參考一下
    2013-08-08
  • javascript閉包功能與用法實(shí)例分析

    javascript閉包功能與用法實(shí)例分析

    這篇文章主要介紹了javascript閉包功能與用法,結(jié)合具體實(shí)例形式深入淺出的分析了javascript中閉包的概念、功能、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-04-04
  • webpack5的entry和output配置小白學(xué)習(xí)

    webpack5的entry和output配置小白學(xué)習(xí)

    這篇文章主要為大家介紹了webpack5的entry和output使用配置小白學(xué)習(xí)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • JavaScript中校驗(yàn)銀行卡號(hào)的實(shí)現(xiàn)代碼

    JavaScript中校驗(yàn)銀行卡號(hào)的實(shí)現(xiàn)代碼

    本文通過案例給大家介紹了js中校驗(yàn)銀行卡號(hào)的代碼,代碼小編測(cè)試過,可行。代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2016-12-12
  • Js中獲取frames中的元素示例代碼

    Js中獲取frames中的元素示例代碼

    本文為大家介紹下使用js獲取父frame元素及獲取子frame元素的實(shí)現(xiàn)代碼,有需求的朋友可以參考下,希望對(duì)大家有所
    2013-07-07
  • javascript 節(jié)點(diǎn)遍歷函數(shù)

    javascript 節(jié)點(diǎn)遍歷函數(shù)

    火狐官網(wǎng)上找到的一組函數(shù),相當(dāng)于treeWalker,有了它可以方便地在IE實(shí)現(xiàn)Traversal API 2的所有功能
    2010-03-03
  • IE6,IE7,IE8下使用Javascript記錄光標(biāo)選中范圍(已補(bǔ)全)

    IE6,IE7,IE8下使用Javascript記錄光標(biāo)選中范圍(已補(bǔ)全)

    IE6,7,8下使用Javascript記錄光標(biāo)選中范圍(已補(bǔ)全)(已解決單個(gè)節(jié)點(diǎn)內(nèi)部重復(fù)字符的問題)
    2011-08-08
  • 如何在vscode中使用Typescript并運(yùn)行詳解

    如何在vscode中使用Typescript并運(yùn)行詳解

    在VSCode中編寫的TypeScript代碼不能直接運(yùn)行,需要先用tsc編譯為JavaScript,然后才能運(yùn)行,下面這篇文章主要給大家介紹了關(guān)于如何在vscode中使用Typescript并運(yùn)行的相關(guān)資料,需要的朋友可以參考下
    2023-05-05

最新評(píng)論