亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

javascript的幾種繼承方法介紹

2019-11-20 10:21:36
字體:
來源:轉載
供稿:網友

1.原型鏈繼承:構造函數、原型和實例的關系:每個構造函數都有一個原型對象,原型對象都包含一個指向構造函數的指針,而實例都包含一個指向原型對象的內部指針。確認原型和實例之間的關系用instanceof。

原型鏈繼承缺點:字面量重寫原型會中斷關系,使用引用類型的原型,并且子類型還無法給超類型傳遞參數

function Parent(){    this.name='mike';  }  function Child(){    this.age=12;  }  //兒子繼承父親(原型鏈)  Child.prototype=new Parent();//Child繼承Parent,通過原型形成鏈條  var test=new Child();  console.log(test.age);  console.log(test.name);//得到被繼承的屬性  //孫子繼續原型鏈繼承兒子  function Brother(){    this.weight=60;  }  Brother.prototype=new Child();//繼承原型鏈繼承  var brother=new Brother();  console.log(brother.name);//繼承了Parent和Child,彈出mike  console.log(brother.age);//12  console.log(brother instanceof Child);//ture  console.log(brother instanceof Parent);//ture  console.log(brother instanceof Object);//ture

2.構造函數實現繼承:又叫偽造對象或經典繼承。
構造函數實現繼承缺點:借用構造函數雖然解決了原型鏈繼承的兩種問題,但沒有原型,則復用無從談起,所以需要原型鏈+借用構造函數模式。

function Parent(age){    this.name=['mike','jack','smith'];    this.age=age;  }  function Child(age){    Parent.call(this,age);//把this指向Parent,同時還可以傳遞參數  }  var test=new Child(21);  console.log(test.age);//21  console.log(test.name);  test.name.push('bill');  console.log(test.name);//mike,jack,smith,bill

3.組合繼承:使用原型鏈實現對原型屬性和方法的繼承,而通過借用構造函數來實現對實例屬性的繼承。這樣即通過在原型上定義方法實現了函數復用,又保證每個實現都有它自己的屬性。

缺點:無論什么情況下,都會調用兩次超類型構造函數,一次是在創建子類型原型的時候,另一次是在創建子類型原型的時候,另一次是在子類型構造函數內部。

function Parent(age){    this.name=['mike','jack','smith'];    this.age=age;  }  Parent.prototype.run=function(){    return this.name+' are both '+this.age;  }  function Child(age){    Parent.call(this,age);//給超類型傳參,第二次調用  }  Child.prototype=new Parent();//原型鏈繼承,第一次調用  var test1=new Child(21);//寫new Parent(21)也行  console.log(test1.run());//mike,jack,smith are both 21  var test2=new Child(22);  console.log(test2.age);  console.log(test1.age);  console.log(test2.run());  //這樣可以使test1和test2分別擁有自己的屬性age同時又可以有run方法

4.原型式繼承:借助原型可以基于已有的對象創建新對象,同時還不必因此創建自定義類型。它要求必須有一個對象可以作為另一個對象的基礎。

function object(o){    function F(){};    F.prototype=o;    return new F();  }  var person={    name:'nicho',    friends:['shell','jim','lucy']  }  var anotherPerson = object(person);  anotherPerson.name = 'Greg';  anotherPerson.friends.push('Rob');  console.log(anotherPerson.friends);//["shell", "jim", "lucy", "Rob"]  var yetAnotherPerson = object(person);  yetAnotherPerson.name = 'Linda';  yetAnotherPerson.friends.push('Barbie');  console.log(yetAnotherPerson.friends);//["shell", "jim", "lucy", "Rob", "Barbie"]  console.log(person.friends);//["shell", "jim", "lucy", "Rob", "Barbie"]

ECMAScript5通過新增Object.create()方法規范化了原型式繼承,這個方法接收兩個參數:一個用作新對象原型的對象和(可選的)一個為新對象定義屬性的對象。

var person2={    name:'nicho',    friends:['shell','jim','lucy']  };  var anoP2=Object.create(person2);  anoP2.name="Greg";  anoP2.friends.push('Rob');  console.log(anoP2.friends);//["shell", "jim", "lucy", "Rob"]  var yetP2=Object.create(person2);  yetP2.name="Linda";  yetP2.friends.push('Barbie');  console.log(yetP2.friends);//["shell", "jim", "lucy", "Rob", "Barbie"]  console.log(person2.friends);//["shell", "jim", "lucy", "Rob", "Barbie"]  /*以這種方式指定的任何屬性都會覆蓋原型對象上的同名屬性。*/  var threeP=Object.create(person,{    name:{value:'red'}  });  console.log(threeP.name);//red,如果threeP中無name則輸出person2里的name值nicho

5.寄生式繼承:思路與寄生構造函數和工廠模式類似,即創建一個僅用于封裝繼承過程的函數,該函數在內部以某種方式來增強對象,最后再像真地是它做了所有工作一樣返回對象。

function object(o){    function F(){};    F.prototype=o;    return new F();  };  function createAnother(o){    var cl=object(o);    cl.sayHi=function(){      console.log('hi');    }    return cl;  };  var person={    name:'nick',    friends:['shelby','court','van']  }  var anotherPerson=createAnother(person);  anotherPerson.sayHi();//hi  console.log(anotherPerson.name);//nick  console.log(anotherPerson.friends);//["shelby", "court", "van"]  /*這個例子中的代碼基于 person 返回了一個新對象―― anotherPerson 。 新對象不僅具有 person   的所有屬性和方法,而且還有自己的 sayHi() 方法*/

寄生組合式繼承:無論什么情況下,都會調用兩次超類型構造函數,一次是在創建子類型原型的時候,另一次是在創建子類型原型的時候,另一次是在子類型構造函數內部,這樣子類型最終會包含超類型對象的全部實例屬性,我們不得不在調用子類型構造函數時重寫這些屬性。因此出現了寄生組合式繼承。

6.寄生組合式繼承:借用構造函數來繼承屬性,通過原型鏈的混成形式來繼承方法?;舅悸罚翰槐貫榱酥付ㄗ宇愋偷脑投{用超類型的構造函數。本質上就是使用寄生式繼承來繼承超類型的原型,然后再將結果指定給子類型的原型。

function SuperType(name){    this.name=name;    this.colors=['red','blue','green'];  }  SuperType.prototype.sayName=function(){    console.log(this.name);  }  function SubType(name,age){    SuperType.call(this,name);    this.age=age;  }  function object(o){    function F(){};    F.prototype=o;    return new F();  };  /*inheritPrototype此函數第一步是創建超類型原型的一個副本。第二步是為創建的副本添加constructor屬性,  * 從而彌補因重寫原型而失去的默認的constructor屬性,第三步將新創建的對象(副本)賦值給子類型的原型*/  function inheritPrototype(subType,superType){    var prototype=object(superType.prototype);//創建對象    prototype.constructor=subType;//增強對象    subType.prototype=prototype;//指定對象  }  inheritPrototype(SubType,SuperType);  SubType.prototype.sayAge=function(){    console.log(this.age);  }  var p=new SubType('xiaoli',24);  console.log(p.sayName());  console.log(p.sayAge());  console.log(p.colors)

此方法優點:只調用了一次父類SuperType構造函數,并且因此避免了在SubType.prototype上面創建不必要的多余的屬性。同時原型鏈還能保持不變,還能正常使用instanceof和isPrototypeOf();

以上這篇javascript的幾種繼承方法介紹就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
丝袜亚洲欧美日韩综合| 亚洲xxx视频| 亚洲精品www久久久久久广东| 亚洲精品91美女久久久久久久| 欧美黑人性猛交| 在线播放国产一区中文字幕剧情欧美| 久久久国产精品视频| 久久久久久com| 欧美成人免费一级人片100| 在线播放日韩av| 国产在线不卡精品| 亚洲性日韩精品一区二区| 97精品视频在线观看| 亚洲欧美在线免费观看| 中文字幕亚洲在线| 久久久人成影片一区二区三区观看| 亚洲无线码在线一区观看| 日韩中文字幕国产精品| 亚洲九九九在线观看| 日韩中文字幕在线播放| 一道本无吗dⅴd在线播放一区| 8090理伦午夜在线电影| 国产69精品99久久久久久宅男| 国产精品久久久久久久久久久新郎| 欧美高清性猛交| 欧洲亚洲妇女av| 国产精品美女www| 国内精品国产三级国产在线专| 中文字幕亚洲综合| 精品动漫一区二区| 青青草成人在线| 国产日韩精品在线播放| 国产亚洲欧美aaaa| 欧洲一区二区视频| 久久久久日韩精品久久久男男| 中文字幕日韩av综合精品| 91av视频在线播放| 91久久久亚洲精品| 欧美高清一级大片| 日韩欧美精品在线观看| 国产主播在线一区| 日韩中文字幕视频在线观看| 91精品国产高清久久久久久久久| 韩国19禁主播vip福利视频| 91av中文字幕| 尤物yw午夜国产精品视频明星| 性色av一区二区咪爱| 国产一区二区三区在线看| 亚洲视频在线免费观看| 国产精品稀缺呦系列在线| 少妇高潮久久77777| 欧美最猛性xxxxx亚洲精品| 国产成人啪精品视频免费网| 亚洲成人av中文字幕| 欧美精品videosex牲欧美| 国产精品视频播放| 国产精品高清免费在线观看| 日韩亚洲精品视频| 欧美性生交xxxxx久久久| 欧美国产日韩免费| 亚洲综合大片69999| 亚洲97在线观看| 日韩免费电影在线观看| 69**夜色精品国产69乱| 一本大道亚洲视频| 91精品久久久久久久| 欧美福利视频在线观看| 91久久中文字幕| 亚洲成avwww人| 国产成人在线一区二区| 欧美情侣性视频| 欧美韩国理论所午夜片917电影| 欧美视频在线观看 亚洲欧| 国产精品稀缺呦系列在线| 日韩女在线观看| 亚洲国产古装精品网站| 国产精品99蜜臀久久不卡二区| 九九视频这里只有精品| 欧美—级高清免费播放| 国产日韩视频在线观看| 91沈先生在线观看| 色播久久人人爽人人爽人人片视av| 日韩在线观看av| 久久久精品美女| 日产日韩在线亚洲欧美| 久久天天躁日日躁| 色www亚洲国产张柏芝| 国产+人+亚洲| 在线精品国产成人综合| 日韩电影中文字幕| 97精品一区二区视频在线观看| 97视频在线观看免费| 国产精品久久久久久久久久ktv| 国产精品va在线播放| 尤物九九久久国产精品的特点| 国产欧美日韩最新| 亚洲一级一级97网| 国产精品日韩在线一区| 另类天堂视频在线观看| 国产欧美日韩精品丝袜高跟鞋| 日本久久久久久久| 91国内精品久久| 91丨九色丨国产在线| 在线观看久久久久久| 欧美日韩精品在线视频| 国产精品亚洲片夜色在线| 国产午夜精品一区二区三区| 国产精品视频网| 日韩精品免费视频| 国产亚洲精品一区二555| 91精品视频在线播放| 欧美激情亚洲自拍| 精品久久久久久久久久久久久| 一本色道久久综合狠狠躁篇怎么玩| 欧美激情在线有限公司| 欧美精品18videos性欧| 国内精品一区二区三区| 久久夜色精品亚洲噜噜国产mv| 欧美美女操人视频| 欧美另类在线播放| 日韩在线观看免费全| 77777少妇光屁股久久一区| 狠狠躁夜夜躁人人爽超碰91| 欧美激情第1页| 色综合导航网站| 青青草原成人在线视频| 国产亚洲人成网站在线观看| 亚洲精品成人久久久| 中文字幕精品在线| 精品少妇一区二区30p| 欧美成人激情在线| 亚洲天天在线日亚洲洲精| 久久精品亚洲94久久精品| 欧美激情videoshd| 国产精品mp4| 成人黄色av网站| 中文字幕日韩精品在线观看| 欧美另类老肥妇| 久久人91精品久久久久久不卡| 欧美裸体男粗大视频在线观看| 日韩美女av在线| 久久69精品久久久久久国产越南| 欧美精品在线观看| 亚洲精品综合久久中文字幕| 久久精品国产一区二区电影| 91精品在线观| 色噜噜久久综合伊人一本| 欧美性猛交xxxx黑人猛交| 亚洲精品成人av| 国产欧美va欧美va香蕉在| 91产国在线观看动作片喷水| 亚洲高清久久久久久| 97色在线视频观看| 亚洲美女免费精品视频在线观看| 青青在线视频一区二区三区| 欧美日韩一区免费| 狠狠躁夜夜躁久久躁别揉| 亚洲欧美日韩在线高清直播| 国产精品中文字幕在线观看| 黄色一区二区在线观看| 91最新在线免费观看| 国产精品爱啪在线线免费观看| 久久久久久久影视| 亚洲人成毛片在线播放|