JavaScript.prototype 和 繼承 - 01

我為什么要把 javascript.prototype 原型單獨(dú)拿出一系列博客來(lái)寫(xiě)?

因?yàn)槠綍r(shí)寫(xiě)js代碼的時(shí)候很少用到!!!惊窖!

我為什么平時(shí)寫(xiě)js代碼的時(shí)候很少用到?

因?yàn)槠綍r(shí)我寫(xiě)js代碼,特別是對(duì)象的時(shí)候.不出意外,99.99999%的情況都是使用字面量的寫(xiě)法!@逶簟=缇啤!

var obj = {
    .....
}

一個(gè)簡(jiǎn)單的場(chǎng)景

我們使用字面量(99.9999%的情況都是如此)聲明一個(gè)對(duì)象.

var obj = {
    name: '李四',
    age: 22
}

然后調(diào)用

obj.showInfo()

不出意外,肯定報(bào)錯(cuò).且報(bào)錯(cuò)信息是 obj.showInfo is not function..

image.png

到目前為止,從來(lái)都沒(méi)有人懷疑過(guò).

這里就應(yīng)該報(bào)錯(cuò).因?yàn)槟銢](méi)有定義這個(gè)方法.

那如果我調(diào)用obj.toString()方法呢?

[object Object]

我沒(méi)有定義 toString 方法,為什么不報(bào)錯(cuò),還正確執(zhí)行了呢?

這個(gè) toString 的方法是哪里來(lái)的?


Object.prototype

在解釋 toString 方法哪里來(lái)的之前

有一個(gè)規(guī)則需要知道: (什么是規(guī)則?規(guī)則就是你可以先不去理解,但是必須強(qiáng)行記憶和知道的知識(shí))

在js中函數(shù)也是對(duì)象,所有的函數(shù)對(duì)象上會(huì)有一個(gè) .prototype 的屬性.

Object 也是一個(gè)函數(shù),所以,它也有 .prototype 屬性.===> Object.prototype

打印一下 Object.prototype 這個(gè)對(duì)象上有哪些屬性?
(請(qǐng)注意,在瀏覽器環(huán)境中打印,在Node.js環(huán)境中打印將會(huì)返回一個(gè)空對(duì)象)

image.png

所以,我們可以先暫時(shí)假定: obj.toString 方法是來(lái)自 Object.prototype 對(duì)象上的.

代碼改造

之前我們的代碼是

var obj = {
    name: '李四',
    age: 22
}

console.log(obj.toString())

[object Object]

之前也說(shuō)過(guò),一般在書(shū)寫(xiě)js代碼創(chuàng)建一個(gè)對(duì)象時(shí).

不夸張的說(shuō) 99.9999999% 的情況都是寫(xiě)的對(duì)象字面量(就像上述那樣)

但實(shí)際上,這段代碼也可以改寫(xiě)成這樣.

var obj = new Object()
obj.name = '李四'
obj.age = 22

我們可以理解成,對(duì)象字面量其實(shí)是一個(gè)語(yǔ)法糖.
它幫我們隱式的調(diào)用了 new Object().

所以,在我們寫(xiě)js代碼利用對(duì)象字面量創(chuàng)建對(duì)象的時(shí)候,new Object() 其實(shí)無(wú)處不在(因?yàn)?9.9999%的情況下,我們都是使用對(duì)象字面量來(lái)創(chuàng)建對(duì)象.反而忽略了new的存在.).


new Object()

現(xiàn)在我們知道了,使用對(duì)象字面量創(chuàng)建對(duì)象只是一個(gè)語(yǔ)法糖.
其內(nèi)部幫我們調(diào)用了 new Object().

如果要了解為什么 obj.toString() 沒(méi)問(wèn)題.

還需要知道一個(gè)前置規(guī)則(第一個(gè)是:所有的函數(shù)都包含一個(gè).prototype屬性)

所有構(gòu)造的對(duì)象(隱式或顯式(用new).都會(huì)從它的構(gòu)造函數(shù)對(duì)象的prototype對(duì)象繼承.

于是,可以畫(huà)一下面這張圖.

image.png
  • Object 是一個(gè)函數(shù),它有一個(gè)屬性叫 .prototype.
  • .prototype 屬性本身也是一個(gè)對(duì)象,它也右邊那些屬性和方法.
  • obj 實(shí)際上是 Object 函數(shù)構(gòu)造出出來(lái)的實(shí)例.所以,根據(jù)第二條規(guī)則,通過(guò) new Object() 創(chuàng)建出來(lái)的對(duì)象,都會(huì)從 Object.prototype 對(duì)象上繼承屬性和方法.
  • 所以,我們調(diào)用 obj.toString 實(shí)際上是調(diào)用的 Object.protoype.toString 方法.

證明obj.toString === Object.prototype.toString

我們先嘗試修改一下 Object.prototype.toString 讓它專(zhuān)門(mén)為 obj 對(duì)象來(lái)使用.

Object.prototype.toString = function () {
  console.log(this.name, this.age)
}

obj.toString()
李四 22

關(guān)于 prototype 對(duì)象屬性的COW(copy on write)

現(xiàn)在在創(chuàng)建一個(gè)對(duì)象字面量,但內(nèi)部沒(méi)有 nameage 屬性.

const obj2 = {}

根據(jù)上述的規(guī)則一 & 規(guī)則二.所以下列這條等式是成立的.

console.log(obj2.toString === Object.prototype.toString) // true.

如果我現(xiàn)利用 obj2 修改了 toString 函數(shù),會(huì)對(duì) obj 產(chǎn)生影響嗎?

obj2.toString = function() {
    console.log('toString函數(shù)被我重寫(xiě)了.')
}
obj.toString()

結(jié)果

李四 22

除非修改 prototype 對(duì)象本身,否則繼承自這個(gè) prototype 對(duì)象的對(duì)象,做的任何修改只會(huì)影響此對(duì)象自己.
而不會(huì)影響到其他的對(duì)象.
這個(gè)就叫做原型對(duì)象的 COW ==copy on write 寫(xiě)時(shí)復(fù)刻==

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嘴秸,一起剝皮案震驚了整個(gè)濱河市毁欣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌岳掐,老刑警劉巖凭疮,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異串述,居然都是意外死亡执解,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)纲酗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)衰腌,“玉大人,你說(shuō)我怎么就攤上這事觅赊∮胰铮” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵吮螺,是天一觀的道長(zhǎng)饶囚。 經(jīng)常有香客問(wèn)我,道長(zhǎng)规脸,這世上最難降的妖魔是什么坯约? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮莫鸭,結(jié)果婚禮上闹丐,老公的妹妹穿的比我還像新娘。我一直安慰自己被因,他們只是感情好卿拴,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著梨与,像睡著了一般堕花。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上粥鞋,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天缘挽,我揣著相機(jī)與錄音,去河邊找鬼。 笑死壕曼,一個(gè)胖子當(dāng)著我的面吹牛苏研,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播腮郊,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼摹蘑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了轧飞?” 一聲冷哼從身側(cè)響起衅鹿,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎过咬,沒(méi)想到半個(gè)月后大渤,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡援奢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年兼犯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片集漾。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡切黔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出具篇,到底是詐尸還是另有隱情纬霞,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布驱显,位于F島的核電站诗芜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏埃疫。R本人自食惡果不足惜伏恐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望栓霜。 院中可真熱鬧翠桦,春花似錦、人聲如沸胳蛮。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)仅炊。三九已至斗幼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抚垄,已是汗流浹背蜕窿。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工谋逻, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人渠羞。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓斤贰,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親次询。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容