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

6種JavaScript繼承方式及優(yōu)缺點(diǎn)(小結(jié))

 更新時(shí)間:2020年02月06日 14:20:46   作者:有魚是只貓  
這篇文章主要介紹了6種JavaScript繼承方式及優(yōu)缺點(diǎn)(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

溫馨提示:想要更好的理解JS繼承方式,須了解構(gòu)造函數(shù)、原型對(duì)象、實(shí)例化對(duì)象、原型鏈等概念

第一種:原型鏈繼承

利用原型鏈的特點(diǎn)進(jìn)行繼承

function Parent(){
  this.name = 'web前端';
  this.type = ['JS','HTML','CSS'];
}
Parent.prototype.Say=function(){
  console.log(this.name);
}
function Son(){};
Son.prototype = new Parent();
son1 = new Son();
son1.Say();

以上例子解釋:

①創(chuàng)建一個(gè)叫做Parent的構(gòu)造函數(shù),暫且稱為父構(gòu)造函數(shù),里面有兩個(gè)屬性name、type
②通過Parent構(gòu)造函數(shù)的屬性(即原型對(duì)象)設(shè)置Say方法,此時(shí),Parent有2個(gè)屬性和1個(gè)方法
③創(chuàng)建一個(gè)叫做Son的構(gòu)造函數(shù),暫且稱為子構(gòu)造函數(shù)
④設(shè)置Son的屬性(即原型對(duì)象)值為父構(gòu)造函數(shù)Parent的實(shí)例對(duì)象,即子構(gòu)造函數(shù)Son繼承了父構(gòu)造函數(shù)Parent,此時(shí)Son也有2個(gè)屬性和1個(gè)方法
⑤對(duì)Son構(gòu)造函數(shù)進(jìn)行實(shí)例化,結(jié)果賦值給變量son1,即son1為實(shí)例化對(duì)象,同樣擁有2個(gè)屬性和1個(gè)方法
⑥輸出son1的Say方法,結(jié)果為"web前端"

優(yōu)點(diǎn):可以實(shí)現(xiàn)繼承

缺點(diǎn):
①因?yàn)镾on.prototype(即原型對(duì)象)繼承了Parent實(shí)例化對(duì)象,這就導(dǎo)致了所有Son實(shí)例化對(duì)象都一樣,都共享有原型對(duì)象的屬性及方法。代碼如下:

son1 = new Son();
son2 = new Son();
son1.type.push('VUE');
console.log(son1.type);//['JS','HTML','CSS','VUE']
console.log(son2.type);//['JS','HTML','CSS','VUE']

結(jié)果son1、son2都是['JS','HTML','CSS','VUE']
②Son構(gòu)造函數(shù)實(shí)例化對(duì)象無法進(jìn)行參數(shù)的傳遞

第二種:構(gòu)造函數(shù)繼承

通過構(gòu)造函數(shù)call方法進(jìn)行繼承,直接來看代碼:

function Parent(){
  this.name = 'web前端';
  this.type = ['JS','HTML','CSS'];
}
function Son(){
  Parent.call(this);
}
son1 = new Son();
son1.type.push('VUE');
console.log(son1.type);//['JS','HTML','CSS','VUE']
son2 = new Son();
console.log(son2.type);//['JS','HTML','CSS']

以上例子解釋:
①創(chuàng)建父級(jí)構(gòu)造函數(shù)Parent,有name、type兩個(gè)屬性
②創(chuàng)建子級(jí)構(gòu)造函數(shù)Son,函數(shù)內(nèi)部通過call方法調(diào)用父級(jí)構(gòu)造函數(shù)Parent,實(shí)現(xiàn)繼承
③分別創(chuàng)建構(gòu)造函數(shù)Son的兩個(gè)實(shí)例化對(duì)象son1、son2,對(duì)son1的type屬性新增元素,son2沒有新增,結(jié)果不一樣,說明實(shí)現(xiàn)了獨(dú)立

優(yōu)點(diǎn):
①實(shí)現(xiàn)實(shí)例化對(duì)象的獨(dú)立性;
②還可以給實(shí)例化對(duì)象添加參數(shù)

function Parent(name){
  this.name = name;
}
function Son(name){
  Parent.call(this,name);
}
son1 = new Son('JS');
console.log(son1);//JS
son2 = new Son('HTML');
console.log(son2);//HTML

缺點(diǎn):
①方法都在構(gòu)造函數(shù)中定義,每次實(shí)例化對(duì)象都得創(chuàng)建一遍方法,基本無法實(shí)現(xiàn)函數(shù)復(fù)用
②call方法僅僅調(diào)用了父級(jí)構(gòu)造函數(shù)的屬性及方法,沒有辦法調(diào)用父級(jí)構(gòu)造函數(shù)原型對(duì)象的方法

第三種:組合繼承

利用原型鏈繼承和構(gòu)造函數(shù)繼承的各自優(yōu)勢(shì)進(jìn)行組合使用,還是看代碼:

function Parent(name){
  this.name = name;
  this.type = ['JS','HTML','CSS'];
}
Parent.prototype.Say=function(){
  console.log(this.name);
}
function Son(name){
  Parent.call(this,name);
}
Son.prototype = new Parent();
son1 = new Son('張三');
son2 = new Son('李四');
son1.type.push('VUE');
son2.type.push('PHP');
console.log(son1.type);//['JS','HTML','CSS','VUE']
console.log(son2.type);//['JS','HTML','CSS','PHP']
son1.Say();//張三
son2.Say();//李四

以上例子解釋:
①創(chuàng)建一個(gè)叫做Parent的構(gòu)造函數(shù),里面有兩個(gè)屬性name、type
②通過Parent構(gòu)造函數(shù)的屬性(即原型對(duì)象)設(shè)置Say方法,此時(shí),Parent有2個(gè)屬性和1個(gè)方法
③創(chuàng)建子級(jí)構(gòu)造函數(shù)Son,函數(shù)內(nèi)部通過call方法調(diào)用父級(jí)構(gòu)造函數(shù)Parent,實(shí)現(xiàn)繼承
④子構(gòu)造函數(shù)Son繼承了父構(gòu)造函數(shù)Parent,此時(shí)Son也有2個(gè)屬性和1個(gè)方法
⑤分別創(chuàng)建構(gòu)造函數(shù)Son的兩個(gè)實(shí)例化對(duì)象son1、son2,傳不同參數(shù)、給type屬性新增不同元素、調(diào)用原型對(duì)象Say方法

優(yōu)點(diǎn):
①利用原型鏈繼承,實(shí)現(xiàn)原型對(duì)象方法的繼承
②利用構(gòu)造函數(shù)繼承,實(shí)現(xiàn)屬性的繼承,而且可以參數(shù)
組合函數(shù)基本滿足了JS的繼承,比較常用

缺點(diǎn):
無論什么情況下,都會(huì)調(diào)用兩次父級(jí)構(gòu)造函數(shù):一次是在創(chuàng)建子級(jí)原型的時(shí)候,另一次是在子級(jí)構(gòu)造函數(shù)內(nèi)部

第四種:原型式繼承

創(chuàng)建一個(gè)函數(shù),將參數(shù)作為一個(gè)對(duì)象的原型對(duì)象

function fun(obj) {
  function Son(){};
  Son.prototype = obj;
  return new Son();
}    
var parent = {
  name:'張三'
}
var son1 = fun(parent);
var son2 = fun(parent);
console.log(son1.name);//張三
console.log(son2.name);//張三

以上例子解釋:
①創(chuàng)建一個(gè)函數(shù)fun,內(nèi)部定義一個(gè)構(gòu)造函數(shù)Son
②將Son的原型對(duì)象設(shè)置為參數(shù),參數(shù)是一個(gè)對(duì)象,完成繼承
③將Son實(shí)例化后返回,即返回的是一個(gè)實(shí)例化對(duì)象
優(yōu)缺點(diǎn):跟原型鏈類似

第五種:寄生繼承

在原型式繼承的基礎(chǔ)上,在函數(shù)內(nèi)部豐富對(duì)象

function fun(obj) {
  function Son() { };
  Son.prototype = obj;
  return new Son();
}
function JiSheng(obj) {
  var clone = fun(obj);
  clone.Say = function () {
    console.log('我是新增的方法');
  }
  return clone;
}
var parent = {
  name: '張三'
}
var parent1 = JiSheng(parent);
var parent2 = JiSheng(parent);
console.log(parent2.Say==parent1.Say);// false

以上例子解釋:
①再原型式繼承的基礎(chǔ)上,封裝一個(gè)JiSheng函數(shù)
②將fun函數(shù)返回的對(duì)象進(jìn)行增強(qiáng),新增Say方法,最后返回
③調(diào)用JiSheng函數(shù)兩次,分別賦值給變量parent1、parent2
④對(duì)比parent1、parent2,結(jié)果為false,實(shí)現(xiàn)獨(dú)立
優(yōu)缺點(diǎn):跟構(gòu)造函數(shù)繼承類似,調(diào)用一次函數(shù)就得創(chuàng)建一遍方法,無法實(shí)現(xiàn)函數(shù)復(fù)用,效率較低

這里補(bǔ)充一個(gè)知識(shí)點(diǎn),ES5有一個(gè)新的方法Object.create(),這個(gè)方法相當(dāng)于封裝了原型式繼承。這個(gè)方法可以接收兩個(gè)參數(shù):第一個(gè)是新對(duì)象的原型對(duì)象(可選的),第二個(gè)是新對(duì)象新增屬性,所以上面代碼還可以這樣:

function JiSheng(obj) {
  var clone = Object.create(obj);
  clone.Say = function () {
    console.log('我是新增的方法');
  }
  return clone;
}
var parent = {
  name: '張三'
}
var parent1 = JiSheng(parent);
var parent2 = JiSheng(parent);
console.log(parent2.Say==parent1.Say);// false

第六種:寄生組合繼承

利用組合繼承和寄生繼承各自優(yōu)勢(shì)
組合繼承方法我們已經(jīng)說了,它的缺點(diǎn)是兩次調(diào)用父級(jí)構(gòu)造函數(shù),一次是在創(chuàng)建子級(jí)原型的時(shí)候,另一次是在子級(jí)構(gòu)造函數(shù)內(nèi)部,那么我們只需要優(yōu)化這個(gè)問題就行了,即減少一次調(diào)用父級(jí)構(gòu)造函數(shù),正好利用寄生繼承的特性,繼承父級(jí)構(gòu)造函數(shù)的原型來創(chuàng)建子級(jí)原型。

function JiSheng(son,parent) {
  var clone = Object.create(parent.prototype);//創(chuàng)建對(duì)象
  son.prototype = clone;   //指定對(duì)象
  clone.constructor = son;   //增強(qiáng)對(duì)象
}
function Parent(name){
  this.name = name;
  this.type = ['JS','HTML','CSS'];
}
Parent.prototype.Say=function(){
  console.log(this.name);
}
function Son(name){
  Parent.call(this,name);
}
JiSheng(Son,Parent);
son1 = new Son('張三');
son2 = new Son('李四');
son1.type.push('VUE');
son2.type.push('PHP');
console.log(son1.type);//['JS','HTML','CSS','VUE']
console.log(son2.type);//['JS','HTML','CSS','PHP']
son1.Say();//張三
son2.Say();//李四

以上例子解釋:
①封裝一個(gè)函數(shù)JiSheng,兩個(gè)參數(shù),參數(shù)1為子級(jí)構(gòu)造函數(shù),參數(shù)2為父級(jí)構(gòu)造函數(shù)
②利用Object.create(),將父級(jí)構(gòu)造函數(shù)原型克隆為副本clone
③將該副本作為子級(jí)構(gòu)造函數(shù)的原型
④給該副本添加constructor屬性,因?yàn)棰壑行薷脑蛯?dǎo)致副本失去默認(rèn)的屬性

優(yōu)缺點(diǎn):
組合繼承優(yōu)點(diǎn)、寄生繼承的有點(diǎn),目前JS繼承中使用的都是這個(gè)繼承方法

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

相關(guān)文章

  • popdiv

    popdiv

    popdiv...
    2006-07-07
  • 解決layui調(diào)用自定義方法提示未定義的問題

    解決layui調(diào)用自定義方法提示未定義的問題

    今天小編就為大家分享一篇解決layui調(diào)用自定義方法提示未定義的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • 提高 DHTML 頁面性能

    提高 DHTML 頁面性能

    提高 DHTML 頁面性能...
    2006-12-12
  • js canvas實(shí)現(xiàn)星空連線背景特效

    js canvas實(shí)現(xiàn)星空連線背景特效

    這篇文章主要為大家詳細(xì)介紹了js canvas實(shí)現(xiàn)星空連線背景特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • javascript實(shí)現(xiàn)數(shù)獨(dú)解法

    javascript實(shí)現(xiàn)數(shù)獨(dú)解法

    數(shù)獨(dú)(すうどく,Sūdoku)是一種運(yùn)用紙、筆進(jìn)行演算的邏輯游戲。玩家需要根據(jù)9×9盤面上的已知數(shù)字,推理出所有剩余空格的數(shù)字,并滿足每一行、每一列、每一個(gè)粗線宮內(nèi)的數(shù)字均含1-9,不重復(fù)。
    2015-03-03
  • ES6中異步對(duì)象Promise用法詳解

    ES6中異步對(duì)象Promise用法詳解

    這篇文章主要介紹了ES6中異步對(duì)象Promise用法,對(duì)比ES5分析了ES6異步方法Promise的使用技巧,并結(jié)合實(shí)例形式分析了連續(xù)使用Promise對(duì)象、Promise捕獲錯(cuò)誤的catch()、以及Promise的高級(jí)用法,需要的朋友可以參考下
    2019-07-07
  • 原生js+cookie實(shí)現(xiàn)購物車功能的方法分析

    原生js+cookie實(shí)現(xiàn)購物車功能的方法分析

    這篇文章主要介紹了原生js+cookie實(shí)現(xiàn)購物車功能的方法,結(jié)合實(shí)例形式分析了javascript結(jié)合cookie存儲(chǔ)實(shí)現(xiàn)購物車功能的相關(guān)操作技巧,需要的朋友可以參考下
    2017-12-12
  • 實(shí)現(xiàn)無刷新聯(lián)動(dòng)例子匯總

    實(shí)現(xiàn)無刷新聯(lián)動(dòng)例子匯總

    最近在用asp.net做項(xiàng)目的時(shí)候,遇到需要實(shí)現(xiàn)無刷新聯(lián)動(dòng)的需求,度娘了一下,這里匯總一下幾個(gè)比較實(shí)用的例子,有需要的小伙伴可以參考下。
    2015-05-05
  • 詳解微信小程序canvas圓角矩形的繪制的方法

    詳解微信小程序canvas圓角矩形的繪制的方法

    這篇文章主要介紹了詳解微信小程序canvas圓角矩形的繪制的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • 利用JS生成博文目錄及CSS定制博客

    利用JS生成博文目錄及CSS定制博客

    這篇文章主要介紹了利用JS生成博文目錄及CSS定制博客的相關(guān)資料,需要的朋友可以參考下
    2016-02-02

最新評(píng)論

舞钢市| 镇赉县| 炉霍县| 阳城县| 钟祥市| 阳原县| 沭阳县| 手游| 新安县| 隆子县| 新邵县| 夏邑县| 北票市| 页游| 平阴县| 丰原市| 民权县| 白朗县| 庆云县| 黑水县| 民权县| 长垣县| 阳朔县| 隆尧县| 陇南市| 勃利县| 确山县| 叙永县| 延长县| 新闻| 洮南市| 东阿县| 郎溪县| 德钦县| 黑河市| 阿瓦提县| 来凤县| 南靖县| 惠安县| 敖汉旗| 武功县|