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

資訊專欄INFORMATION COLUMN

你是否理解js的Object與Function與原型鏈

itvincent / 2559人閱讀

摘要:原型對(duì)象是由創(chuàng)建的,因此原型對(duì)象的構(gòu)造函數(shù)是構(gòu)造函數(shù)也可以是稱為對(duì)象,原型對(duì)象也就繼承了其生父構(gòu)造函數(shù)中的數(shù)據(jù),也同時(shí)繼承了原型對(duì)象的數(shù)據(jù)。當(dāng)然這條原型鏈中的數(shù)據(jù),會(huì)被還是還是這類構(gòu)造函數(shù)繼承,但是不會(huì)被這些繼承,他們不處于同一個(gè)鏈條上。

js中,F(xiàn)unction的本質(zhì)是什么?
Object的本質(zhì)又是什么?
js中有幾條原型鏈?

javascript的語(yǔ)言基于原型鏈,而實(shí)際上js的有兩條原型鏈。開發(fā)者主要用到的是圖中的紅色原型鏈,如給Array.prototype.xxx=yyy,那么就可以[...].xxx,數(shù)組實(shí)例對(duì)象就繼承了其構(gòu)造函數(shù)原型對(duì)象中的數(shù)據(jù),當(dāng)然實(shí)踐一般不會(huì)給修改Array這類構(gòu)造函數(shù)的原型對(duì)象,最多的就是自定義構(gòu)造函數(shù),然后給自定義的構(gòu)造函數(shù)定義原型對(duì)象,那么這個(gè)構(gòu)造函數(shù)的所有實(shí)例對(duì)象也就都繼承了原型對(duì)象中的數(shù)據(jù)。這就是圖中紅色原型鏈的所表示的。

那么Array.prototype和自定義構(gòu)造函數(shù)function f(){}的prototype的原型對(duì)象是從哪里來(lái)的,是誰(shuí)創(chuàng)造了它?

諸如Array.prototype.xxx=yyy,這實(shí)際上就是引用了Array的原型對(duì)象prototype而已,也就是它的原型對(duì)象就已經(jīng)存在了,然后才讓其能夠被引用到。

包括Array.prototype,還是String.prototype,還是Object.prototype,還是Function.prototype,還是自定義構(gòu)造函數(shù)function f(){}的prototype,它們都不是開發(fā)者創(chuàng)建的,而是Function構(gòu)造函數(shù)在創(chuàng)建其他構(gòu)造函數(shù)時(shí),用Object()創(chuàng)建的。

可以說(shuō)Function構(gòu)造函數(shù)是javascript世界中的萬(wàn)物之主,像盤古開天辟地創(chuàng)建了javascript的語(yǔ)言世界和運(yùn)行機(jī)制。而OBject的本質(zhì)就是用于創(chuàng)建原型對(duì)象。

Function構(gòu)造函數(shù)內(nèi)部有一個(gè)this.prototype=new Object(),當(dāng)Function造物時(shí),就同時(shí)通過(guò)這句this.prototype=new Object(),給這個(gè)物賦予了靈魂。而Object在javascript中的本質(zhì)也就在于此,作為Function手中的魂燈,賦予其創(chuàng)建的物體靈魂,也就是給予它原型對(duì)象,讓它能夠通過(guò)原型對(duì)象,能夠從上面繼承和吸收能量。

Function構(gòu)造函數(shù),創(chuàng)建了Array構(gòu)造函數(shù),同時(shí)通過(guò)new Object()給其創(chuàng)建了prototype對(duì)象,因此有Array.prototype。然后[1,2,3]就是由Array構(gòu)造函數(shù)創(chuàng)建,因此[1,2,3]數(shù)組實(shí)例對(duì)象,繼承了Array構(gòu)造函數(shù)中的數(shù)據(jù),同時(shí)繼承了Array.prototype中的數(shù)據(jù)。

Array.prototype原型對(duì)象是由this.prototyoe=new Object()創(chuàng)建的,因此Array.prototype原型對(duì)象的構(gòu)造函數(shù)是Object構(gòu)造函數(shù)(也可以是稱為對(duì)象),Array.prototype原型對(duì)象也就繼承了其生父Object構(gòu)造函數(shù)中的數(shù)據(jù),也同時(shí)繼承了Object.prototype原型對(duì)象的數(shù)據(jù)。

因此,你可以看到,toString()這個(gè)方法追根溯源,實(shí)際上是Object.prototype.toString,在Function創(chuàng)建Array的時(shí)候,Object就跟著創(chuàng)建了Array.prototype,它就繼承了Object和Object.prototype中的數(shù)據(jù),[1,2,3]數(shù)組對(duì)象由Array創(chuàng)建,因此[1,2,3]也就繼承了Array、Array.prototype、Object、Object.prototype中的數(shù)據(jù),因此最終才可以調(diào)用[1,2,3].toString()。

對(duì)于String、Boolean等構(gòu)造函數(shù),還是自定義構(gòu)造函數(shù)function f(){...}也都是這樣。

function f(){...},看上去是你寫了這個(gè)普通的構(gòu)造函數(shù),實(shí)際上這個(gè)普通的函數(shù)是Function創(chuàng)建的,你寫的這個(gè)f函數(shù),由于是Function()實(shí)例化出來(lái)的(也就是函數(shù)的f的構(gòu)造函數(shù)就是Function),那么普通函數(shù)f作為Function構(gòu)造函數(shù)的實(shí)例對(duì)象,那么普通函數(shù)f也就會(huì)繼承Function構(gòu)造函數(shù)和Function.prototype中的數(shù)據(jù)。

說(shuō)來(lái)詭異的是,也是Function自己創(chuàng)建了自己,正是在在創(chuàng)建自己的時(shí)候,通過(guò)this.prototype=new Object()給自己也創(chuàng)建了原型對(duì)象,就是圖中藍(lán)色的原型對(duì)象,這個(gè)原型對(duì)象由于是new Object實(shí)例化的,因此這個(gè)藍(lán)色的原型對(duì)象,也就繼承了Object和Object.prototype原型對(duì)象中的數(shù)據(jù),這樣說(shuō)來(lái),Object的原型對(duì)象是原型鏈條中的最頂層的一個(gè)對(duì)象,然后原型鏈往下揪分裂成了兩條。

Function.prototype原型對(duì)象雖然繼承了Object.prototype中的數(shù)據(jù),但是它自己還擴(kuò)展了自己專有的屬性和方法,分別是name、length、call()、apply()、bind()這五個(gè),然后由于普通函數(shù)f就是由Funciton創(chuàng)建出來(lái)的,因此這個(gè)普通函數(shù)也就繼承了Function和Function.prototype中的數(shù)據(jù),因此你才可以使用f.apply()還是f.bind(this),也因此才可以使用Array.apply(),這就是圖中的第二條藍(lán)色的原型鏈。當(dāng)然這條原型鏈中的數(shù)據(jù),會(huì)被Array還是String還是Boolean這類構(gòu)造函數(shù)繼承,但是不會(huì)被[1,2,3]這些繼承,他們不處于同一個(gè)鏈條上。

雖然Function創(chuàng)建了它自己,也創(chuàng)建了Object,但到底它是先創(chuàng)建自己還是先創(chuàng)建Object就無(wú)從得知了。如果Function先創(chuàng)建了自己,那么在它創(chuàng)建自己的時(shí)候,還在使用this.prototype=new Object()給自己創(chuàng)建原型對(duì)象時(shí),這個(gè)Object又是哪里來(lái)的,難道Object就已經(jīng)先存在了?如果Object先于Function存在了,但Funciton都還沒有存在,它怎么去創(chuàng)建Object?這到底是雞生蛋還是蛋生雞無(wú)從得知,這也反映了javascript語(yǔ)言底層機(jī)制就是混亂的。

也許這一切都很繞,但是只有理解了Function與Object,才能更清晰高屋建瓴的理解原本繁蕪繁雜和混亂的javascript。

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

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

相關(guān)文章

  • 理解js原型繼承

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

    wthee 評(píng)論0 收藏0
  • js內(nèi)功修煉之九陽(yáng)神功--原型

    摘要:寫在前面如果說(shuō)是一本武學(xué)典籍,那么原型鏈就是九陽(yáng)神功。那么,如何修煉好中的九陽(yáng)神功呢真正的功法大成的技術(shù)是從底層上去理解,那種工程師和碼農(nóng)的區(qū)別就在于對(duì)底層的理解,當(dāng)你寫完一行代碼,或者你遇見一個(gè)解決的速度取決于你對(duì)底層的理解。 寫在前面 如果說(shuō)JavaScript是一本武學(xué)典籍,那么原型鏈就是九陽(yáng)神功。在金庸的武俠小說(shuō)里面,對(duì)九陽(yáng)神功是這樣描述的:練成「九陽(yáng)神功」后,會(huì)易筋洗髓;生出...

    蘇丹 評(píng)論0 收藏0
  • js內(nèi)功修煉之九陽(yáng)神功--原型

    摘要:寫在前面如果說(shuō)是一本武學(xué)典籍,那么原型鏈就是九陽(yáng)神功。那么,如何修煉好中的九陽(yáng)神功呢真正的功法大成的技術(shù)是從底層上去理解,那種工程師和碼農(nóng)的區(qū)別就在于對(duì)底層的理解,當(dāng)你寫完一行代碼,或者你遇見一個(gè)解決的速度取決于你對(duì)底層的理解。 寫在前面 如果說(shuō)JavaScript是一本武學(xué)典籍,那么原型鏈就是九陽(yáng)神功。在金庸的武俠小說(shuō)里面,對(duì)九陽(yáng)神功是這樣描述的:練成「九陽(yáng)神功」后,會(huì)易筋洗髓;生出...

    Profeel 評(píng)論0 收藏0
  • js內(nèi)功修煉之九陽(yáng)神功--原型

    摘要:寫在前面如果說(shuō)是一本武學(xué)典籍,那么原型鏈就是九陽(yáng)神功。那么,如何修煉好中的九陽(yáng)神功呢真正的功法大成的技術(shù)是從底層上去理解,那種工程師和碼農(nóng)的區(qū)別就在于對(duì)底層的理解,當(dāng)你寫完一行代碼,或者你遇見一個(gè)解決的速度取決于你對(duì)底層的理解。 寫在前面 如果說(shuō)JavaScript是一本武學(xué)典籍,那么原型鏈就是九陽(yáng)神功。在金庸的武俠小說(shuō)里面,對(duì)九陽(yáng)神功是這樣描述的:練成「九陽(yáng)神功」后,會(huì)易筋洗髓;生出...

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

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

0條評(píng)論

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