最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

徹底搞定原型鏈

2021-06-22 11:21 作者:自由的加百利  | 我要投稿
  • 注意: 這篇文章假定你熟悉基本的構(gòu)造函數(shù)及json對象的用法

  • 另外: 這篇文章假定你能夠分清楚函數(shù)的this指向問題

  • But: 如果你暫時還搞不定,請先閱讀文章?《用中國話學(xué)this指向》

  • 這篇文章同時假定你知道什么是數(shù)據(jù)結(jié)構(gòu),以及單向鏈表

先看一個典型的單向鏈表

上面這段代碼,是一個典型的?單向鏈表

我們只能通過?n.next?來找到下一個節(jié)點

但是沒有辦法從當(dāng)前節(jié)點找到上一個節(jié)點

不過這和原型鏈有什么關(guān)系呢?

目前還沒有關(guān)系。

原型對象從哪來?

分析上面這段代碼

為什么obj明明是空的,卻還能調(diào)用toString方法?

這toString方法是哪里來的呢?

再比如我們的數(shù)組對象

其實,這些方法都來自于一個叫做原型的家伙

我們可以使用 對象.__proto__ 的形式把原型對象打印出來

這是所有對象的一個隱式屬性, 也就是正常情況下打印對象, 我們是看不到這個屬性的

但我們依然可以通過?__proto__??這樣一個比較奇怪的屬性名字來訪問原型對象

這個屬性名稱訪問起來確實不夠方便,實際上它還有另外一種訪問方式

也是一種比較正式的訪問方式, 就是通過函數(shù)名來訪問

例如看下面這個例子

現(xiàn)在我們大概有了一些疑問

  • 1.原型對象中的所有屬性,實例對象都能隨便訪問嗎?

  • 2.每個實例對象都有自己的原型對象, 還是大家共用一個?

  • 3.實例對象自己的屬性和原型的屬性沖突了, 會訪問誰呢?

  • 4.原型對象跟繼承有什么關(guān)系?

  • 5.原型鏈又是怎么來的?

我們依次來解決幾個疑問

1.原型對象中的所有屬性,實例對象都能隨便訪問嗎?

廢話不多說, 我們來試驗一下, 就知道結(jié)果

在上面的代碼中,我們創(chuàng)建一個構(gòu)造函數(shù)?Phone

同時我們給原型對象,添加了?price、color兩個屬性

同時添加了?playmusic、phonecall兩個方法

接下來我們通過實例對象來訪問一下這些內(nèi)容

可以看到,原型中的屬性和方法都可以被實例對象直接訪問!

2.每個實例對象都有自己的原型對象, 還是大家共用一個?

這是一道非常簡單的數(shù)學(xué)證明題,證明過程如下:

最終結(jié)論是,?所有實例對象共享同一個原型對象

3.實例對象自己的屬性和原型的屬性沖突了, 會訪問誰呢?

我們再來試驗一下

可以看到, 如果對象本身存在這個屬性或方法, 會優(yōu)先訪問自己的

如果沒有, 則訪問原型的屬性, 訪問過程如下圖

4.原型對象跟繼承有什么關(guān)系呢 ?

請你再思考一個問題

如果原型也是一個對象

那么它必然也應(yīng)該有自己的原型對象,不是嗎?

我們可以通過?p1.__proto__.__proto__?進(jìn)行訪問

我們把圖畫的再簡單一點

從圖中可以看出,只要原型對象一直存在

對象P1就擁有了所有原型對象的能力, 我們也管這個叫做?繼承

而這些原型對象之間是什么關(guān)系呢?

p1

p1.__proto__

p1.__proto__.__proto__

p1.__proto__.__proto__.__proto__

原型鏈, 因此而得名

需要補充的問題

原型對象真的沒有盡頭嗎?

當(dāng)然不是的, 原型對象由瀏覽器自動創(chuàng)建, 當(dāng)然也有它自己的規(guī)則

規(guī)則如下:

  • 1.每個構(gòu)造函數(shù)在誕生的時候, 都會創(chuàng)建一個該函數(shù)的實例對象作為默認(rèn)原型

    相當(dāng)于?Phone.prototype = new Phone();

  • 2.而這個原型對象的原型, 則默認(rèn)指向Object.prototype

    相當(dāng)于?Phone.prototype.__proto__ = Object.prototype;

  • 3.當(dāng)然, Object.prototype 也是它自己的實例

    相當(dāng)于?Object.prototype = new Object();

  • 4. 但是, Object.prototype不再擁有原型對象

    相當(dāng)于?Object.prototype.__proto__ = null

  • 5. 因此,原型對象是有上限的

    p1.__proto__?可訪問

    p1.__proto__.__proto__?可訪問

    p1.__proto__.__proto__.__proto__?為null

原型的應(yīng)用場景是什么?

擴展能力



徹底搞定原型鏈的評論 (共 條)

分享到微博請遵守國家法律
沅江市| 绥棱县| 丰都县| 汨罗市| 台前县| 洪江市| 留坝县| 怀仁县| 龙山县| 元谋县| 绥江县| 彭阳县| 大余县| 嘉定区| 华蓥市| 清水河县| 乌兰察布市| 来安县| 凤城市| 江孜县| 枣庄市| 商洛市| 青神县| 黎平县| 隆林| 田东县| 灌南县| 常熟市| 石狮市| 喀什市| 渝北区| 邹平县| 习水县| 肥乡县| 托克托县| 文水县| 进贤县| 永泰县| 洛扎县| 慈溪市| 永泰县|