亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

js 原型鏈

wua_wua2012 / 2451人閱讀

摘要:當(dāng)通過(guò)原型鏈繼承了之后,就變成了的一個(gè)實(shí)例,因此它也擁有了一個(gè)它自己的屬性就跟專(zhuān)門(mén)創(chuàng)建了一個(gè)屬性一樣。有鑒于此,再加上前面剛剛討論過(guò)的由于原型中包含引用類(lèi)型值所帶來(lái)的問(wèn)題,實(shí)踐中很少會(huì)多帶帶使用原型鏈

記錄下自己對(duì)js 原型的一些理解
先看一下什么是 ····原型鏈

function Foo(){}
Foo.prototype.num = 3;
// new Foo( ) 將返回一個(gè)對(duì)象 把這個(gè)對(duì)象賦值給了 bar 
var bar = new Foo();
// bar 是怎么找到的原型下面的num呢?
alert(bar.num); //3  

bar并沒(méi)有num 屬性,它是怎么拿到3的呢 此處的 bar 就是通過(guò)原型鏈找到了值
原型鏈
JavaScript中的對(duì)象有一個(gè)特殊的 __proto__ 內(nèi)置屬性,其實(shí)就是對(duì)于其他對(duì)象的引用(關(guān)聯(lián))。當(dāng)我們使用 function關(guān)鍵字聲明一個(gè)函數(shù)時(shí),系統(tǒng)會(huì)自動(dòng)創(chuàng)建一個(gè)對(duì)象,訪問(wèn)這個(gè)對(duì)象可以通過(guò) 函數(shù)名.prototype 訪問(wèn)(我們一般把這個(gè)對(duì)象叫做原型對(duì)象),當(dāng)使用 new 關(guān)鍵字調(diào)用函數(shù)(這時(shí)我們一般把這個(gè)函數(shù)稱(chēng)為構(gòu)造函數(shù))時(shí)其中有一個(gè)步驟就是對(duì)創(chuàng)建的對(duì)象進(jìn)行原型關(guān)聯(lián),關(guān)聯(lián)到聲明函數(shù)時(shí)創(chuàng)建的那個(gè)對(duì)象(函數(shù)名.prototype指向的那個(gè)對(duì)象)。

上面例子 中使用 new 關(guān)鍵字調(diào)用 Foo()函數(shù)時(shí)會(huì)創(chuàng)建一個(gè)對(duì)象我們把這個(gè)對(duì)象賦值給了 bar ; bar對(duì)象內(nèi)部的.__proto__屬性會(huì)關(guān)聯(lián)到聲明函數(shù)時(shí)創(chuàng)建的那個(gè)對(duì)象(Foo.prototype) , bar.num屬性在bar中無(wú)法找到時(shí),就會(huì)訪問(wèn)bar.__proto__查找,這個(gè)過(guò)程會(huì)持續(xù)到找到匹配的屬性名或者查找完整條prototype鏈(所有普通的[[Prototype]]鏈最終都會(huì)指向內(nèi)置的Object.prototype)
,因此上面例子的原型鏈?zhǔn)沁@樣的

bar.__proto__ -- 指向 --> Foo.prototype --然后(Foo.prototype.__proto__) -- 指向 --> Object.prototype

因此
每個(gè)構(gòu)造函數(shù)都有一個(gè)原型對(duì)象,原型對(duì)象都包含一個(gè)指向構(gòu)造函數(shù)的指針,而實(shí)例都包含一個(gè)指向原型對(duì)象的內(nèi)部指針。那么,假如我們讓原型對(duì)象等于另一個(gè)類(lèi)型的實(shí)例,結(jié)果會(huì)怎么樣呢?顯然,此時(shí)的原型對(duì)象將包含一個(gè)指向另一個(gè)原型的指針,相應(yīng)地,另一個(gè)原型中也包含著一個(gè)指向另一個(gè)構(gòu)造函數(shù)的指針。假如另一個(gè)原型又是另一個(gè)類(lèi)型的實(shí)例,那么上述關(guān)系依然成立,如此層層遞進(jìn),就構(gòu)成了實(shí)例與原型的鏈條。這就是所謂原型鏈的基本概念
對(duì)prototype更詳細(xì)的介紹請(qǐng)看這里(https://developer.mozilla.org...

原型鏈的問(wèn)題

包含引用類(lèi)型值的原型屬性會(huì)被所有實(shí)例共享;(而這也正是為什么要在構(gòu)造函數(shù)中,而不是在原型對(duì)象中定義屬性的原因)在通過(guò)原型來(lái)實(shí)現(xiàn)繼承時(shí),原型實(shí)際上會(huì)變成另一個(gè)類(lèi)型的實(shí)例。于是,原先的實(shí)例屬性也就順理成章地變成了現(xiàn)在的原型屬性了。下列代碼可以用來(lái)說(shuō)明這個(gè)問(wèn)題。

function SuperType(){   
  this.colors = ["red", "blue", "green"];
}
function SubType(){}//繼承了SuperType
SubType.prototype = new SuperType();
var instance1 =newSubType();
instance1.colors.push("black");
//"red,blue,green,black"
alert(instance1.colors);
var instance2 = new SubType();
//"red,blue,green,black"
alert(instance2.colors);

SuperType構(gòu)造函數(shù)定義了一個(gè)colors屬性,該屬性包含一個(gè)數(shù)組(引用類(lèi)型值)。SuperType的每個(gè)實(shí)例都會(huì)有各自包含自己數(shù)組的colors屬性。當(dāng)SubType通過(guò)原型鏈繼承了SuperType之后,SubType.prototype就變成了SuperType的一個(gè)實(shí)例,因此它也擁有了一個(gè)它自己的colors屬性——就跟專(zhuān)門(mén)創(chuàng)建了一個(gè)SubType.prototype.colors屬性一樣。但結(jié)果是什么呢?結(jié)果是SubType的所有實(shí)例都會(huì)共享這一個(gè)colors屬性。而我們對(duì)instance1.colors的修改能夠通過(guò)instance2.colors反映出來(lái),就已經(jīng)充分證實(shí)了這一點(diǎn)。

在創(chuàng)建子類(lèi)型的實(shí)例時(shí),不能向超類(lèi)型的構(gòu)造函數(shù)中傳遞參數(shù)。實(shí)際上,應(yīng)該說(shuō)是沒(méi)有辦法在不影響所有對(duì)象實(shí)例的情況下,給超類(lèi)型的構(gòu)造函數(shù)傳遞參數(shù)。有鑒于此,再加上前面剛剛討論過(guò)的由于原型中包含引用類(lèi)型值所帶來(lái)的問(wèn)題,實(shí)踐中很少會(huì)多帶帶使用原型鏈

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

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

相關(guān)文章

  • JS基礎(chǔ)-原型、原型真的不能一知半解

    摘要:原型鏈和對(duì)象的原型是對(duì)象實(shí)例和它的構(gòu)造函數(shù)之間建立的鏈接,它的值是構(gòu)造函數(shù)的。對(duì)象的原型根據(jù)上文提到的構(gòu)造調(diào)用函數(shù)的時(shí)候會(huì)創(chuàng)建一個(gè)新對(duì)象,自動(dòng)將的原型指向構(gòu)造函數(shù)的對(duì)象。 showImg(https://segmentfault.com/img/remote/1460000020185197); JS的原型、原型鏈一直是比較難理解的內(nèi)容,不少初學(xué)者甚至有一定經(jīng)驗(yàn)的老鳥(niǎo)都不一定能完全說(shuō)清...

    changfeng1050 評(píng)論0 收藏0
  • 從實(shí)現(xiàn)角度分析js原型

    摘要:從實(shí)現(xiàn)角度分析原型鏈歡迎來(lái)我的博客閱讀從實(shí)現(xiàn)角度分析原型鏈網(wǎng)上介紹原型鏈的優(yōu)質(zhì)文章已經(jīng)有很多了,比如說(shuō)作為補(bǔ)充,就讓我們換個(gè)角度,從實(shí)現(xiàn)來(lái)分析一下吧本文假設(shè)你對(duì)原型鏈已經(jīng)有所了解。 從實(shí)現(xiàn)角度分析js原型鏈 歡迎來(lái)我的博客閱讀:《從實(shí)現(xiàn)角度分析js原型鏈》 網(wǎng)上介紹原型鏈的優(yōu)質(zhì)文章已經(jīng)有很多了,比如說(shuō): https://github.com/mqyqingfeng/Blog/issu...

    CompileYouth 評(píng)論0 收藏0
  • 理解js原型與繼承

    摘要:相當(dāng)于在用原型繼承編寫(xiě)復(fù)雜代碼前理解原型繼承模型十分重要。同時(shí),還要清楚代碼中原型鏈的長(zhǎng)度,并在必要時(shí)結(jié)束原型鏈,以避免可能存在的性能問(wèn)題。 js是一門(mén)動(dòng)態(tài)語(yǔ)言,js沒(méi)有類(lèi)的概念,ES6 新增了class 關(guān)鍵字,但只是語(yǔ)法糖,JavaScript 仍舊是基于原型。 至于繼承,js的繼承與java這種傳統(tǒng)的繼承不一樣.js是基于原型鏈的繼承. 在javascript里面,每個(gè)對(duì)象都有一...

    wthee 評(píng)論0 收藏0
  • js原型 原型 原型的繼承

    摘要:圖片描述缺點(diǎn)是無(wú)法實(shí)現(xiàn)多繼承可以在構(gòu)造函數(shù)中,為實(shí)例添加實(shí)例屬性。 對(duì)象的方法 Object.assign() 對(duì)象可以簡(jiǎn)寫(xiě) ,如果 key 和 value 相等則可以簡(jiǎn)寫(xiě) let name = xm; let age = 2; let obj = { name, age, fn(){ // 可以省略函數(shù)關(guān)鍵字和冒號(hào): console.log(2...

    soasme 評(píng)論0 收藏0
  • js原型

    摘要:構(gòu)造函數(shù),實(shí)例,原型三者的關(guān)系如下圖構(gòu)造函數(shù)是構(gòu)成整個(gè)原型鏈的關(guān)鍵,是他利用將原型傳給了后代。因此,通過(guò)操縱構(gòu)造函數(shù)的,就能夠操縱原型鏈,從而對(duì)原型鏈進(jìn)行自在的拼接。 要理解js的原型鏈主要就是理清楚以下三者的關(guān)系: 構(gòu)造函數(shù)的protitype屬性 對(duì)象的__proto__屬性 對(duì)象的constructor屬性 在js中,函數(shù)作為一等公民,它是一個(gè)對(duì)象,可以擁有自己的屬性,可...

    NervosNetwork 評(píng)論0 收藏0
  • 【前端基礎(chǔ)進(jìn)階】JS原型、原型、對(duì)象詳解

    摘要:二構(gòu)造函數(shù)我們先復(fù)習(xí)一下構(gòu)造函數(shù)的知識(shí)上面的例子中和都是的實(shí)例。這兩個(gè)實(shí)例都有一個(gè)構(gòu)造函數(shù)屬性,該屬性是一個(gè)指針指向。原型鏈其中是對(duì)象的實(shí)例。 一. 普通對(duì)象與函數(shù)對(duì)象 JavaScript 中,萬(wàn)物皆對(duì)象!但對(duì)象也是有區(qū)別的。分為普通對(duì)象和函數(shù)對(duì)象,Object 、Function 是 JS 自帶的函數(shù)對(duì)象。下面舉例說(shuō)明 var o1 = {}; var o2 =new Objec...

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

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

0條評(píng)論

wua_wua2012

|高級(jí)講師

TA的文章

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