成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

JS面向?qū)ο笾?【原型鏈】(對(duì)象和對(duì)象之間的關(guān)系)

Jochen / 2519人閱讀

摘要:面向?qū)ο笾玩湆?duì)象和對(duì)象之間的關(guān)系注意這個(gè)系列文章要經(jīng)常站在之父的視角去思考。思考問(wèn)題我們都知道都屬于那么既然他們都是對(duì)象一定有某些相同之處吧對(duì)象和對(duì)象之間有什么關(guān)聯(lián)呢如果說(shuō)你沒(méi)有思考過(guò)這個(gè)問(wèn)題那么可以換一個(gè)更具體的問(wèn)題。

JS面向?qū)ο笾?【原型鏈】(對(duì)象和對(duì)象之間的關(guān)系)

注意這個(gè)系列文章,要經(jīng)常站在JS之父的視角去思考。

牢記我們的需求,我要在JS沒(méi)有class的情況下,那么利用JS現(xiàn)有的東西,搞出類似class的東西。

回一下JS有什么? 有7種數(shù)據(jù)類型:

6個(gè)基本數(shù)據(jù)類型 : string number boolean null undefined symbol

1個(gè)引用類型 : obj (你需要知道前6個(gè)基本數(shù)據(jù)類型是存儲(chǔ)在棧中的, 1個(gè)引用類型obj存儲(chǔ)是的引用,它的值存儲(chǔ)在堆中的.)

對(duì)象分成3類: 普通對(duì)象 、數(shù)組對(duì)象 、函數(shù)對(duì)象。

思考問(wèn)題1: 我們都知道array function都屬于object,那么既然他們都是對(duì)象,一定有某些相同之處吧,對(duì)象和對(duì)象之間有什么關(guān)聯(lián)呢?

如果說(shuō)你沒(méi)有思考過(guò)這個(gè)問(wèn)題,那么可以換一個(gè)更具體的問(wèn)題。

思考問(wèn)題2: 打印這段代碼,到瀏覽器控制臺(tái),你會(huì)發(fā)現(xiàn)我們空對(duì)象,"自帶"了一個(gè)toString()?

var obj = {
    name: "ziwei",
    sex : "男",
    eat : function(){}
}
obj.toString()

問(wèn)題1: array funciton obj 都是對(duì)象,那么為什么說(shuō)他們都是對(duì)象,通過(guò)什么關(guān)聯(lián)起來(lái)的?

問(wèn)題2: 為什么一個(gè)空對(duì)象,"自帶"toString()方法?

如果你不清楚以上問(wèn)題的答案,恭喜你,這篇文章的主題【原型鏈】就可以清楚的解答你的疑惑。

原型鏈 什么場(chǎng)景下,需要原型鏈。

還是上面這段代碼

var obj = {
    name: "ziwei",
    sex : "男",
    eat : function(){}
}
obj.toString()

如果我們想自己實(shí)現(xiàn),讓obj,具有toString()怎么辦? 直覺(jué)肯定是添加在obj上咯。

這樣因?yàn)閠oString(),是函數(shù)對(duì)象,所以需要在內(nèi)存中開(kāi)辟一塊空間,存放toString()

現(xiàn)在,我們要聲明100個(gè)obj對(duì)象,他們都需要具備toString()怎么辦?

如果循環(huán)100次給每個(gè)obj都添加toString(),需要在內(nèi)存空間開(kāi)辟100個(gè)空間,存在100個(gè)相同的toString(),勢(shì)必造成內(nèi)存空間的浪費(fèi),在JS被創(chuàng)造時(shí),內(nèi)存還是十分寶貴的資源。

所以JS之父想出一個(gè)辦法。把對(duì)象需要共享的屬性和方法,放到一個(gè)內(nèi)存空間里,然后每一個(gè)對(duì)象都有一個(gè)屬性都指向這一個(gè)空間。

所以原型鏈被發(fā)明,最樸素的想法就是節(jié)省內(nèi)存空間。

JS里如何設(shè)計(jì)原型鏈規(guī)則的呢?

1.所有對(duì)象都有的這個(gè)屬性長(zhǎng)得很奇怪,叫做 proto

var obj = {}
console.log(obj.__proto__ )  訪問(wèn),你就可以查看所有object都共享的屬性。

2.這個(gè)__proto__所指向的那塊內(nèi)存空間里的屬性,并不是在var obj = {}時(shí),才被添加進(jìn)去的,而是一直都存在的。

通過(guò) window.Object.prototype  你同樣可以訪問(wèn)到這個(gè)共享的內(nèi)存空間

3.__proto__里面還可以有__proto__,畢竟被稱為原型鏈嘛。

之所以需要"鏈",你可以看這樣一個(gè)例子

var arr = []
數(shù)組作為一個(gè)數(shù)組是有push()方法的, 可是我們查看 window.Object.prototype里并沒(méi)有共享push方法

我們?yōu)榱藢?shí)現(xiàn)數(shù)組有push方法,但是不能讓所有的對(duì)象都有push方法,為了實(shí)現(xiàn)這個(gè)需求,JS是這樣設(shè)計(jì)的。

JS另外開(kāi)辟了一個(gè)內(nèi)存空間,用來(lái)專門存儲(chǔ)數(shù)組的共有方法和屬性。你可以用過(guò)window.Array.prototype來(lái)訪問(wèn)它

這樣JS數(shù)組,arr通過(guò)__proto__繼承了Array.prototype的方法,有通過(guò)Array.prototype.__proto__繼承了Object.prototype上的訪問(wèn)。

類似的我們?cè)L問(wèn)obj.name時(shí),JS會(huì)在obj內(nèi)部尋找name屬性,如果沒(méi)有,就會(huì)到__proto__中去尋找name,一直到Object.prototype如果還是沒(méi)有name,就會(huì)返回undefined

所以這種依靠原型來(lái)繼承的方式,很想一個(gè)鏈條,一層一層的向上尋找,所以叫做原型鏈,原型鏈的頂端就是Object.prototype

最后回答文章最初的2個(gè)問(wèn)題:

問(wèn)題1: array funciton obj 都是對(duì)象,那么為什么說(shuō)他們都是對(duì)象,通過(guò)什么關(guān)聯(lián)起來(lái)的?

他們就是通過(guò)__proto__關(guān)聯(lián)的。
Array.prototype.__proto__ 繼承了 Object.prototype
Function.prototype.__proto__ 繼承了 Object.prototype

他們同根同源,都繼承自O(shè)bject.prototype,數(shù)組只是比普通的對(duì)象多了一些方法,所以他們都是對(duì)象唄

![圖片上傳中...]

問(wèn)題2: 為什么一個(gè)空對(duì)象,"自帶"toString()方法?

因?yàn)樗袑?duì)象都自帶__proto__屬性,這個(gè)屬性指向Object.prototype這個(gè)內(nèi)存空間。

因?yàn)镺bject.prototype存儲(chǔ)著有toString(),所以所有對(duì)象都有。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/92415.html

相關(guān)文章

  • 【譯】每個(gè)JavaScript 開(kāi)發(fā)者應(yīng)該了解10個(gè)面試題

    摘要:避免脆弱的基類問(wèn)題。紅牌警告沒(méi)有提到上述任何問(wèn)題。單向數(shù)據(jù)流意味著模型是單一的事實(shí)來(lái)源。單向數(shù)據(jù)流是確定性的,而雙向綁定可能導(dǎo)致更難以遵循和理解的副作用。原文地址 1. 你能說(shuō)出兩種對(duì) JavaScript 應(yīng)用開(kāi)發(fā)者而言的編程范式嗎? 希望聽(tīng)到: 2. 什么是函數(shù)編程? 希望聽(tīng)到: 3. 類繼承和原型繼承的不同? 希望聽(tīng)到 4. 函數(shù)式編程和面向?qū)ο缶幊痰膬?yōu)缺點(diǎn)? ...

    mykurisu 評(píng)論0 收藏0
  • JS原型

    摘要:指向原型對(duì)象的構(gòu)造函數(shù)二原型鏈?zhǔn)裁词窃玩溤玩溇褪菍?shí)例對(duì)象和原型對(duì)象之間的關(guān)系,他們使用來(lái)關(guān)聯(lián)。改變指向?qū)崿F(xiàn)繼承創(chuàng)建類創(chuàng)建原型對(duì)象每天堅(jiān)持鍛煉創(chuàng)建構(gòu)造函數(shù)函數(shù)就是改變執(zhí)行代碼片段中指向。 一. JS原型的簡(jiǎn)單理解 1.1 prototype prototype:是一個(gè)函數(shù)的屬性,每個(gè)函數(shù)中都會(huì)有一個(gè)prototype屬性,這個(gè)屬性是一個(gè)指針,指向一個(gè)對(duì)象。在JavaScript...

    winterdawn 評(píng)論0 收藏0
  • JS原型

    摘要:指向原型對(duì)象的構(gòu)造函數(shù)二原型鏈?zhǔn)裁词窃玩溤玩溇褪菍?shí)例對(duì)象和原型對(duì)象之間的關(guān)系,他們使用來(lái)關(guān)聯(lián)。改變指向?qū)崿F(xiàn)繼承創(chuàng)建類創(chuàng)建原型對(duì)象每天堅(jiān)持鍛煉創(chuàng)建構(gòu)造函數(shù)函數(shù)就是改變執(zhí)行代碼片段中指向。 一. JS原型的簡(jiǎn)單理解 1.1 prototype prototype:是一個(gè)函數(shù)的屬性,每個(gè)函數(shù)中都會(huì)有一個(gè)prototype屬性,這個(gè)屬性是一個(gè)指針,指向一個(gè)對(duì)象。在JavaScript...

    wwolf 評(píng)論0 收藏0
  • JS原型

    摘要:指向原型對(duì)象的構(gòu)造函數(shù)二原型鏈?zhǔn)裁词窃玩溤玩溇褪菍?shí)例對(duì)象和原型對(duì)象之間的關(guān)系,他們使用來(lái)關(guān)聯(lián)。改變指向?qū)崿F(xiàn)繼承創(chuàng)建類創(chuàng)建原型對(duì)象每天堅(jiān)持鍛煉創(chuàng)建構(gòu)造函數(shù)函數(shù)就是改變執(zhí)行代碼片段中指向。 一. JS原型的簡(jiǎn)單理解 1.1 prototype prototype:是一個(gè)函數(shù)的屬性,每個(gè)函數(shù)中都會(huì)有一個(gè)prototype屬性,這個(gè)屬性是一個(gè)指針,指向一個(gè)對(duì)象。在JavaScript...

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

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

0條評(píng)論

閱讀需要支付1元查看
<