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

資訊專欄INFORMATION COLUMN

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

itvincent / 2602人閱讀

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

轉載請注明本文地址:http://www.ezyhdfw.cn/yun/83923.html

相關文章

  • 理解js原型繼承

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

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

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

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

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

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

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

    morgan 評論0 收藏0

發(fā)表評論

0條評論

itvincent

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<