成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

經(jīng)典原型鏈、繼承解析

yiliang / 1194人閱讀

摘要:原型我們知道任何一個(gè)函數(shù)都存在一個(gè)屬性,他是個(gè)對(duì)象,這個(gè)對(duì)象我們就叫他原型對(duì)象這個(gè)原型對(duì)象本身也自帶兩個(gè)屬性和這個(gè)屬性是指向創(chuàng)建此對(duì)象的構(gòu)造函數(shù)的引用,構(gòu)造函數(shù)的實(shí)例化對(duì)象,也可以通過屬性來訪問構(gòu)造它的那個(gè)函數(shù)這個(gè)屬性指向創(chuàng)建此對(duì)象的構(gòu)造函

原型

我們知道任何一個(gè)函數(shù)都存在一個(gè)prototype屬性,他是個(gè)對(duì)象,這個(gè)對(duì)象 我們就叫他原型對(duì)象
這個(gè)原型對(duì)象本身也自帶兩個(gè)屬性:constructor 和 proto

constructor: 這個(gè)屬性是指向創(chuàng)建此對(duì)象的構(gòu)造函數(shù)的引用,構(gòu)造函數(shù)的實(shí)例化對(duì)象,也可以通過constuctor屬性來訪問構(gòu)造它的那個(gè)函數(shù)

_proto_: 這個(gè)屬性指向創(chuàng)建此對(duì)象的構(gòu)造函數(shù)的prototype原型對(duì)象的引用

  例子:
//我的家族姓莫
function Parent(){
    this.name = "mo"
}
//我家族是音樂世家
 Parent.prototype.work = function(){
     return "musicing"
 }
 
 //爸媽生了我
 var me = new Parent()

 //我也要唱歌
 console.log(me.work())   //=>musicing

 //爸爸媽媽又生了二胎
 var myBrother = new Parent()

 //他也會(huì)唱歌
 console.log(myBrother.work())  //=>musicing

 //證明我兩是否是親生的
 console.log(me.work() === myBrother.work())  //=>true

解釋一波:
    me 和 myBrother 是構(gòu)造函數(shù)Parent()new出來的的一個(gè)實(shí)例,me 和 myBrother 都有一個(gè)隱式屬性_proto_,引用Parent() 的prototype屬性來得到繼承
原型鏈

在訪問 me 的 work 方法時(shí),找不到, 就會(huì)順著_protp_屬性往上在構(gòu)造函數(shù)的prototype找,找到了就停止,沒找到繼續(xù)往上到Object.prototype找,再?zèng)]找到就到null了,自然也找不到就只能返回undifined,這種鏈?zhǔn)降囊镁褪窃玩?,通過原型鏈實(shí)現(xiàn)繼承還是很方便的

萬一原型鏈斷鏈呢?

原因:如果對(duì) 構(gòu)造函數(shù) 或者 原型鏈 修改一些方法或者屬性的時(shí)候,導(dǎo)致函數(shù)的constructor不等于創(chuàng)建它的構(gòu)造函數(shù),那就會(huì)斷鏈

如果 先實(shí)例再通過 字面量添加或修改,那么后新定義的方法就對(duì)先繼承的方法或?qū)傩跃蜁?huì)不在生效,就會(huì)斷鏈,這是因?yàn)樽置媪縼硇薷脑蜁r(shí),constructor發(fā)生了改變,也就是說該函數(shù)指向的創(chuàng)建該函數(shù)的構(gòu)造函數(shù)發(fā)生了改變,字面量默認(rèn)的constructor的值是Object(),所以為了避免斷鏈,盡量不要使用字面量重新賦值,修改

 例子:
 //創(chuàng)建一個(gè)構(gòu)造函數(shù)Car
function Car(){
 this.brand = "大奔";
}
//大奔 80萬
Car.prototype.price = "80";

//我來買一個(gè)大奔 先實(shí)例
var benCar1 = new Car();
console.log(benCar1.price)  //=>80

//我希望我的大奔 帶有翅膀的 能飛
Car.prototype = {
 hasWing: true,
 hasFlying: function(){
     console.log("flying...")
 }
}

var benCar = new Car()

(1) 正常情況下 
console.log(benCar1.brand,benCar1.price,benCar1.hasWing,benCar1.hasFlying,benCar1.constructor)
 //=> 大奔 80 undefined undefined  ? Car(){}

(2)字面量添加屬性方法時(shí)
console.log(benCar.brand,benCar.price,benCar.hasWing,benCar.hasFlying,benCar.constructor) 
//=> 大奔 undefined true ? (){} ? Object() { [native code] }
繼承的幾種方式

(1) 原型鏈繼承

原型鏈繼承是通過 new實(shí)例化構(gòu)造函數(shù) 賦給子類的原型, 其實(shí)實(shí)例的子類本身是完全的空對(duì)象,所有的屬性方法都需要去原型鏈上找。
例子:

function Grandpa(){
    this.name = "mo"
}
Grandpa.prototype.work = function(){
     return "musicing"
 }
 function Parent(){

}
Parent.prototype = new Grandpa()

 var me = new Parent()
 console.log(me.work())   //=>musicing 我找啊找啊原來是Grandpa會(huì)musicing
 var myBrother = new Parent()
 console.log(myBrother.work())  //=>musicing

 console.log(me.work() === myBrother.work())  //=>true

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

構(gòu)造函數(shù)繼承 通過apply去調(diào)用父類的構(gòu)造函數(shù),達(dá)到繼承父類的實(shí)例屬性,對(duì),只能繼承屬性,要想繼承方法 采用寄生組合繼承
例子
function Grandpa(firstname){
    this.name = "mo " + firstname
}
Grandpa.prototype.work = function(){
     return "musicing"
 }
 function Parent(firstname){
    Grandpa.apply(this, arguments)
}
Parent.prototype = new Grandpa()

 var me = new Parent("alice")
 console.log(me.work())   //=>musicing
 var myBrother = new Parent("bob")
 console.log(myBrother.work())  //=>musicing

 console.log(me.work() === myBrother.work())  //=>true
 console.log(me.name, myBrother.name,me.name === myBrother.name)//=>mo alice ,mo bob ,false

(3) 寄生組合繼承

寄生組合繼承是我們經(jīng)常要用到的,組合了原型和構(gòu)造函數(shù),結(jié)合Object.create(obj),方法對(duì)傳入的對(duì)象進(jìn)行淺拷貝,這樣可以實(shí)現(xiàn)對(duì)實(shí)例屬性和原型屬性分別進(jìn)行繼承

淺拷貝:僅僅是指向被拷貝的內(nèi)存地址,如果原地址中對(duì)象被改變了,那么淺拷貝出來的對(duì)象也會(huì)相應(yīng)改變

例子:
// 寄生組合繼承
function Grandpa(firstname){
    this.name = "mo " + firstname
}
Grandpa.prototype.work = function(){
     return "musicing"
 }
 function Parent(firstname){
    Grandpa.apply(this, arguments)
}
// Parent.prototype = new Grandpa()
//改成
Parent.prototype = Object.create(Grandpa.prototype); // Object.create()將父級(jí)對(duì)象的屬性和方法進(jìn)行引用
Parent.prototype.constructor = Parent;  //將該函數(shù)的construnctor指向parent構(gòu)造函數(shù)
console.log(Parent.prototype)

 var me = new Parent("alice")
 var myBrother = new Parent("bob")

 console.log(me.work() === myBrother.work())  //=>true
console.log(me.name, myBrother.name,me.name === myBrother.name)//=>mo alice ,mo bob ,false

好了,有時(shí)間還會(huì)補(bǔ)充...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/90456.html

相關(guān)文章

  • 前端面試經(jīng)典題目匯總(持續(xù)更新中)

    摘要:只要沒有被覆蓋的話對(duì)象原型的屬性就能在所有的實(shí)例中找到,若整個(gè)原型鏈未找到則返回如何實(shí)現(xiàn)繼承構(gòu)造繼承原型繼承實(shí)例繼承拷貝繼承原型機(jī)制或和方法去實(shí)現(xiàn)較簡單,建議使用構(gòu)造函數(shù)與原型混合方式。 HTML相關(guān)問題 1.XHTML和HTML有什么區(qū)別 HTML是一種基本的WEB網(wǎng)頁設(shè)計(jì)語言,XHTML是一個(gè)基于XML的標(biāo)記語言最主要的不同:XHTML 元素必須被正確地嵌套。XHTML 元素必須被...

    BigNerdCoding 評(píng)論0 收藏0
  • 前端面試經(jīng)典題目匯總(持續(xù)更新中)

    摘要:只要沒有被覆蓋的話對(duì)象原型的屬性就能在所有的實(shí)例中找到,若整個(gè)原型鏈未找到則返回如何實(shí)現(xiàn)繼承構(gòu)造繼承原型繼承實(shí)例繼承拷貝繼承原型機(jī)制或和方法去實(shí)現(xiàn)較簡單,建議使用構(gòu)造函數(shù)與原型混合方式。 HTML相關(guān)問題 1.XHTML和HTML有什么區(qū)別 HTML是一種基本的WEB網(wǎng)頁設(shè)計(jì)語言,XHTML是一個(gè)基于XML的標(biāo)記語言最主要的不同:XHTML 元素必須被正確地嵌套。XHTML 元素必須被...

    Warren 評(píng)論0 收藏0
  • 前端面試經(jīng)典題目匯總(持續(xù)更新中)

    摘要:只要沒有被覆蓋的話對(duì)象原型的屬性就能在所有的實(shí)例中找到,若整個(gè)原型鏈未找到則返回如何實(shí)現(xiàn)繼承構(gòu)造繼承原型繼承實(shí)例繼承拷貝繼承原型機(jī)制或和方法去實(shí)現(xiàn)較簡單,建議使用構(gòu)造函數(shù)與原型混合方式。 HTML相關(guān)問題 1.XHTML和HTML有什么區(qū)別 HTML是一種基本的WEB網(wǎng)頁設(shè)計(jì)語言,XHTML是一個(gè)基于XML的標(biāo)記語言最主要的不同:XHTML 元素必須被正確地嵌套。XHTML 元素必須被...

    Tony_Zby 評(píng)論0 收藏0
  • JavaScript六種非常經(jīng)典的對(duì)象繼承方式

    摘要:就是這個(gè)原理直接將某個(gè)對(duì)象直接賦值給構(gòu)造函數(shù)的原型。五寄生式繼承重點(diǎn)創(chuàng)建一個(gè)僅用于封裝繼承過程的函數(shù),該函數(shù)在內(nèi)部以某種方式來增強(qiáng)對(duì)象,最后返回構(gòu)造函數(shù)。 一、原型鏈繼承 重點(diǎn):利用原型讓一個(gè)引用類型繼承另外一個(gè)引用類型的屬性和方法。構(gòu)造函數(shù),原型,實(shí)例之間的關(guān)系:每個(gè)構(gòu)造函數(shù)都有一個(gè)原型對(duì)象,原型對(duì)象包含一個(gè)指向構(gòu)造函數(shù)的指針,而實(shí)例都包含一個(gè)指向原型對(duì)象的內(nèi)部指針。 functio...

    sunnyxd 評(píng)論0 收藏0
  • JavaScript系列--淺析原型繼承

    摘要:綜上所述有原型鏈繼承,構(gòu)造函數(shù)繼承經(jīng)典繼承,組合繼承,寄生繼承,寄生組合繼承五種方法,寄生組合式繼承,集寄生式繼承和組合繼承的優(yōu)點(diǎn)于一身是實(shí)現(xiàn)基于類型繼承的最有效方法。 一、前言 繼承是面向?qū)ο螅∣OP)語言中的一個(gè)最為人津津樂道的概念。許多面對(duì)對(duì)象(OOP)語言都支持兩種繼承方式::接口繼承 和 實(shí)現(xiàn)繼承 。 接口繼承只繼承方法簽名,而實(shí)現(xiàn)繼承則繼承實(shí)際的方法。由于js中方法沒有簽名...

    draveness 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<