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

首頁 > 編程 > JavaScript > 正文

javascript 原型鏈維護和繼承詳解

2019-11-20 13:52:14
字體:
來源:轉載
供稿:網友

一.兩個原型

很多人都知道javascript是原型繼承,每個構造函數都有一個prototype成員,通過它就可以把javascript的繼承演義的美輪美奐了.
其實啊,光靠這一個屬性是無法完成javascript的繼承.
我們在代碼中使用的prototype完成繼承在這里就不多說了.大家可以查一下資料.
另外一個看不見的prototype成員.
每一個實例都有有一條指向原型的prototype屬性,這個屬性是無法被訪問到的,當然也就無法被修改了,因為這是維護javascript繼承的基礎.

復制代碼 代碼如下:

//構造器聲明
        function Guoyansi(){ }
        function GuoyansiEx(){}
        //原型繼承
         GuoyansiEx.prototype=new Guoyansi();
       //創建對象
       var g1=new GuoyansiEx();
       var g2=new GuoyansiEx();

上面的代碼中的對象可以用下面的圖來說明

二.原型的維護

一個構造器產生的實例,其constructor屬性總是指向該構造器.我們暫且認為該話是對的.

復制代碼 代碼如下:

function Guoyansi(){ }
var obj1=new Guoyansi();
console.log(obj1.constructor===Guoyansi);//true

其實構造器本身是沒有constructor這個屬性的,那么這個屬性是來自哪呢?
答案是:來自原型.
因此得出下面的結論

復制代碼 代碼如下:
obj1.constructor===Guoyansi.prototype.constructor===Guoyansi

既然我們可以通過constructor來尋找構造器.因此我們就可以進一步完善上面的圖了.

復制代碼 代碼如下:

 function GuoyansiEx(){}
             GuoyansiEx.prototype=new Guoyansi();
             console.log(GuoyansiEx.constructor===GuoyansiEx)//false

根據上圖,上面的結果應該是true,但為什么是false呢?

現在做個分析.
GuoyansiEx的原型被Guoyansi的實例重寫了,那么GuoyansiEx的原型中的constructor自然也是來自Guoyansi的實例.
而Guoyansi實例中的constructor又是來自Guoyansi.prototype.而Guoyansi.prototype沒有被重寫,
所以Guoyansi.prototype的constructor指向Guoyansi(構造函數);

根據以上分析得出下面的結論

復制代碼 代碼如下:
GuoyansiEx.constructor===Guoyansi.constructor===Guoyansi;

如果在開發過程中對于Constructor的指向要求非常精確的話,可以做如下處理.

復制代碼 代碼如下:

/**方法一:**/
 function Guoyansi(){}
             function GuoyansiEx(){}
             GuoyansiEx.prototype=new Guoyansi();
             GuoyansiEx.prototype.constructor=GuoyansiEx;//重置constructor指向.

復制代碼 代碼如下:

/**
            方法二
            **/
            function Guoyansi(){}
            function GuoyansiEx(){
                this.constructor=arguments.callee;
            }
            GuoyansiEx.prototype=new Guoyansi();

復制代碼 代碼如下:

/**
            方法三
            **/
            function Guoyansi(){}
            function GuoyansiEx(){
                this.constructor=GuoyansiEx;
            }
            GuoyansiEx.prototype=new Guoyansi();

三.看不見的原型有什么用呢?

看得見的原型鏈我們可以對他操作來完成我們的繼承,那么這個看不見的原型鏈我們既看不見,又無法操作.要它有何用.
面向對象中繼承有一個特性:相似性.子類與父類具有相似性.因此在子類中你是無法用delete刪除從父類繼承而來的成員.也就是說子類必須具有父類的特性.
為了維護這個特性,javascript在對象的內部產生了一條我們看不見的原型屬性,并且不允許用戶訪問.這樣,用戶可以處于任何目的來修改constructor,
而不會破壞子類擁有父類的特性.
簡而言之:內部原型是javascript的原型繼承機制所需要的,而外部原型是用戶實現繼承所需要的.

四.火狐引擎SpiderMonkey中的__proto__

還是這段代碼.

復制代碼 代碼如下:

function Guoyansi(){}
            Guoyansi.prototype.age=24;
            function GuoyansiEx(){}
            var obj1=new Guoyansi();
            GuoyansiEx.prototype=obj1;
            GuoyansiEx.prototype.constructor=GuoyansiEx;//重置constructor指向.
            var obj2=new GuoyansiEx();

我現在想要從obj開始向上訪問父類Guoyansi的prototype的屬性的age.
思路是這樣的.
第一步:obj2====>obj2.constructor.prototype
第二部:obj2.constructor.prototype===>GuoyansiEx.prototype;
第三部:GuoyansiEx.prototype===>obj1;
第四部:obj1.constructor====>Guoyansi
第五部:Guoyansi.prototype.age

寫成這這樣:console.log(obj2.constructor.prototype.constructor.prototype.age)//24;
最終的結果是24.
最終的結果是24.可以正常執行,但是在好多書上說constructor修改后,級無法在找到父類中的原型了.不知道是怎么回事.

在火狐中提夠了一種更加簡潔的屬性._proto_
SpiderMonkey中默認在任何創建的對象上添加了一個名為_proto_的屬性,該屬性指向構造器所用的原型.
其實就是我們上面提到的不可見的原型鏈,只不過是在這個地方變相的公開而已.
可以這樣訪問到age
console.log(obj2.__proto__.__proto__.age);//24
這樣的確是成功的訪問到了父類的原型屬性,但是這個屬性只適用于火狐,在其他瀏覽器中是會出錯的.
在E5中對Object做出了擴展Object.getPrototypeOf(),可以訪問到所有父類的原型了.

復制代碼 代碼如下:

function Guoyansi(){}
            Guoyansi.prototype.age=24;
            function GuoyansiEx(){}
            var obj1=new Guoyansi();
            GuoyansiEx.prototype=obj1;
            GuoyansiEx.prototype.constructor=GuoyansiEx;//重置constructor指向.
            var obj2=new GuoyansiEx();
            var proto=Object.getPrototypeOf(obj2);
            while(proto){
                console.log(proto.constructor);
                proto=Object.getPrototypeOf(proto);
            }
            console.log("object的原型"+proto);

結果是:GuoyansiEx
Guoyansi
Object
object的原型null

個人覺得這些應該算是javascript面向對象的精髓之一了.小伙伴們自己參考下,根據需求使用到自己的項目中去吧

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品视频xxx| 国产成人黄色av| 国产精品极品在线| 精品国产91久久久久久老师| 不卡伊人av在线播放| 午夜精品一区二区三区在线播放| 一区二区亚洲欧洲国产日韩| 在线精品播放av| 久久影视电视剧免费网站| 亚洲国产精品久久久久| 国内揄拍国内精品少妇国语| 色综合久久中文字幕综合网小说| 日韩福利伦理影院免费| 日韩电影中文字幕在线观看| 激情懂色av一区av二区av| 中文字幕不卡在线视频极品| 成人免费看吃奶视频网站| 亚洲毛片在线观看| 欧美日韩免费在线观看| 91免费视频网站| 亚洲欧美日韩中文在线| 日本三级韩国三级久久| 欧美成人在线免费视频| 日本精品久久久久久久| 在线电影欧美日韩一区二区私密| 国内精品中文字幕| 欧美精品情趣视频| 日韩在线视频中文字幕| 欧美大片在线看免费观看| 精品亚洲一区二区三区四区五区| 国产精品高潮在线| 日韩有码在线视频| 亚洲欧美国产制服动漫| 国产美女搞久久| 伊人精品在线观看| 国产综合在线观看视频| 国产不卡av在线免费观看| 久久亚洲电影天堂| 欧美精品午夜视频| 国产丝袜一区视频在线观看| 91性高湖久久久久久久久_久久99| 欧美日韩国产色| 日韩成人在线播放| 中文字幕亚洲字幕| 在线精品国产欧美| 精品久久久久久久久国产字幕| 日韩高清a**址| 日韩一区在线视频| 91精品国产高清| 久久久国产在线视频| 国产精品白嫩初高中害羞小美女| 国产精品久久久久久久久影视| 欧美夫妻性生活xx| 在线看欧美日韩| 欧美日韩国产限制| 中文字幕一精品亚洲无线一区| 92福利视频午夜1000合集在线观看| 日韩高清中文字幕| 中文字幕亚洲欧美日韩高清| 国产精品美女在线观看| 欧美日韩免费区域视频在线观看| 久久久成人精品| 97精品欧美一区二区三区| 欧美丝袜一区二区| 欧美小视频在线观看| 日韩亚洲在线观看| 亲爱的老师9免费观看全集电视剧| 国产精品视频色| 国产免费一区二区三区在线能观看| 亚洲japanese制服美女| 亚洲国产古装精品网站| 国产精品久久久久久久久久| 影音先锋欧美在线资源| 国产精品aaa| 久久乐国产精品| 亚洲字幕一区二区| 九九精品视频在线| 45www国产精品网站| 97久久伊人激情网| 91精品国产网站| 国产精品日韩欧美大师| 国产在线一区二区三区| 青青久久av北条麻妃海外网| 国产精品免费一区二区三区都可以| 日本精品久久久久影院| 精品福利视频导航| 一区二区三区在线播放欧美| 国产成人精品最新| 国产美女被下药99| 亚洲第一区在线| 欧美日韩第一页| 欧美亚洲激情在线| 国产一区二区三区在线观看视频| 亚洲成人在线视频播放| 国产精品女视频| 欧美日韩一区二区在线播放| 中文字幕亚洲国产| 欧美噜噜久久久xxx| 青青青国产精品一区二区| 国产91网红主播在线观看| 久久久久久久久中文字幕| 欧美中文字幕在线视频| 中文字幕一精品亚洲无线一区| 国模极品一区二区三区| 国产视频精品在线| 91久久久久久久一区二区| 国产精品久久久久免费a∨大胸| 欧美成人中文字幕| 精品国产老师黑色丝袜高跟鞋| 国产啪精品视频| 欧美中文在线字幕| 亚洲乱码一区二区| 一本色道久久综合狠狠躁篇的优点| 亚洲一区精品电影| 91久久精品国产91性色| 欧美视频精品一区| 国产精品香蕉av| 精品国产欧美一区二区三区成人| 亚洲日韩欧美视频一区| 亚洲男人天堂网| 亚洲欧美激情在线视频| 97久久精品视频| 国产精品香蕉国产| 欧美国产在线视频| 欧美大片第1页| 日韩av在线导航| 精品在线小视频| 欧美精品亚州精品| www.精品av.com| 国产精品久久国产精品99gif| 亚洲精品一区二区三区婷婷月| 国产综合福利在线| 亚洲伊人第一页| 欧美高清性猛交| 亚洲成人av中文字幕| 欧美激情日韩图片| 久久中文字幕一区| 欧美日韩国产一区二区三区| 日韩av资源在线播放| 国产亚洲一区二区在线| 欧美激情精品久久久久久免费印度| 日韩欧美高清视频| 欧美一区二区大胆人体摄影专业网站| 精品国产一区二区三区久久狼5月| 国产精品视频久久久| 亚洲va欧美va在线观看| 日韩在线免费视频观看| 668精品在线视频| 中文字幕日韩欧美| 国产精品视频999| 欧美极品在线视频| 国产视频欧美视频| 亚洲精品日韩久久久| 国产精品久久久久久久午夜| 欧美自拍大量在线观看| 久久伊人精品视频| 欧美日本高清一区| 久热在线中文字幕色999舞| 国内精品久久久久伊人av| 日韩在线免费高清视频| 久久九九免费视频| 国产做受高潮69| 国产丝袜视频一区| 九九热精品视频国产|