摘要:前言說(shuō)到原型鏈,中,萬(wàn)物皆對(duì)象,而規(guī)定,所有對(duì)象都有自己的原型對(duì)象,一方面,任何對(duì)象都可以充當(dāng)其他對(duì)象的原型,另一方面,原型也是對(duì)象,也擁有自己的原型,因此形成的鏈就是原型鏈。
前言
說(shuō)到原型鏈,javascript 中,萬(wàn)物皆對(duì)象,而 javascript 規(guī)定,所有對(duì)象都有自己的原型對(duì)象(prototype) ,一方面,任何對(duì)象都可以充當(dāng)其他對(duì)象的原型,另一方面,原型(prototype)也是對(duì)象,也擁有自己的原型,因此形成的鏈就是原型鏈。到這里我就啰嗦幾句,javascript 的設(shè)計(jì)者Brendan Eich在設(shè)計(jì)這門(mén)語(yǔ)言之初,只是想它在網(wǎng)頁(yè)上實(shí)現(xiàn)簡(jiǎn)單的交互,比如表單提交前進(jìn)行簡(jiǎn)單的校驗(yàn),所以沒(méi)有設(shè)計(jì)類與繼承的概念,因?yàn)橛X(jué)得這樣的話太正式了,但是受時(shí)代的影響,javascript里面都是對(duì)象,雖然沒(méi)有繼承,但是也要一種機(jī)制,把這些對(duì)象聯(lián)系起來(lái),這種機(jī)制就是原型鏈。話不多說(shuō),上圖
圖解假設(shè)有一個(gè)內(nèi)存空間(正方形表示),這片內(nèi)存里放了一個(gè)構(gòu)造函數(shù)Dog(用三角形表示)
function Dog () { this.leg = 4; this.bray = function () { alert("wangwang"); } }
設(shè)置構(gòu)造函數(shù)的原型函數(shù)(prototype)
Dog.prototype = { spacies: "dog" } console.log(Dog.prototype) // {spacies: "dog"}
那么,就會(huì)在另外一個(gè)內(nèi)存中存儲(chǔ) Dog 的 prototype 對(duì)象(用橢圓形表示),如圖所示,構(gòu)造函數(shù)的protype指向它的原型
現(xiàn)在我們用 構(gòu)造函數(shù) Dog 來(lái)創(chuàng)建對(duì)象 dog1, dog2, ...
var dog1 = new Dog(); dog1.name = "大黃"; dog1.color = "yellow"; var dog2 = new Dog(); dog2.name = "小黑"; dog2.color = "black"; console.log(dog1.name) // 大黃 console.log(dog2.name) // 小黑 console.log(dog1.spacies) // dog console.log(dog2.spacies) // dog console.log(dog1.constructor === Dog) // true
可以看到由構(gòu)造函數(shù)創(chuàng)造的對(duì)象dog1,dog2,他們的constructor指向構(gòu)造函數(shù)Dog,而他們的__proto__指向Dog的prototype,而且當(dāng)調(diào)用對(duì)象的一個(gè)屬性或方法時(shí),首先會(huì)找對(duì)象本身的屬性或方法,找不到時(shí),會(huì)找該對(duì)象的__proto__對(duì)象(也就是構(gòu)造函數(shù)的prototype對(duì)象),以此類推,會(huì)找原型鏈上所有對(duì)象有沒(méi)有該屬性,如果找到則返回該屬性的值,如果還是找不到則返回undefined
另外可以看出來(lái)dog1,dog2,...的__proto__指向同一塊內(nèi)存地址,這樣設(shè)計(jì)是為了節(jié)省內(nèi)存資源,不用每次創(chuàng)建都存儲(chǔ)他們相同的屬性,當(dāng)修改dog1的__proto__時(shí),dog2的__proto__也會(huì)改變
dog1.__proto__.spacies = "animal"; // 或者Dog.prototype.spacies = "animal" console.log(dog2.spacies) // animal
上面也說(shuō)到了,每一個(gè)對(duì)象都有自己的__proto__,而作為構(gòu)造函數(shù)Dog的prototype對(duì)象,也會(huì)有自己的對(duì)象原型,以此類推,原型鏈的頂端是一個(gè)null,如圖的紅線串起來(lái)的鏈就是原型鏈
額,來(lái)一個(gè)句話收尾吧,這是我自己對(duì)原型連的理解,歡迎探討
參考Javascript繼承機(jī)制的設(shè)計(jì)思想
prototype 對(duì)象
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/52398.html
摘要:前言說(shuō)到原型鏈,中,萬(wàn)物皆對(duì)象,而規(guī)定,所有對(duì)象都有自己的原型對(duì)象,一方面,任何對(duì)象都可以充當(dāng)其他對(duì)象的原型,另一方面,原型也是對(duì)象,也擁有自己的原型,因此形成的鏈就是原型鏈。 前言 說(shuō)到原型鏈,javascript 中,萬(wàn)物皆對(duì)象,而 javascript 規(guī)定,所有對(duì)象都有自己的原型對(duì)象(prototype) ,一方面,任何對(duì)象都可以充當(dāng)其他對(duì)象的原型,另一方面,原型(protot...
摘要:先來(lái)一張圖看看幾個(gè)名詞的關(guān)系構(gòu)造函數(shù)原型實(shí)例原諒我的狂草字體,我手寫(xiě)比用電腦畫(huà)快。今天我們只說(shuō)原型鏈,所以接下來(lái)我就圍繞著原型鏈的幾個(gè)部分說(shuō)起。每個(gè)函數(shù)都有一個(gè)屬性借用屬性存儲(chǔ)了的原型對(duì)象。 先來(lái)一張圖看看幾個(gè)名詞的關(guān)系 構(gòu)造函數(shù)、原型、實(shí)例 showImg(https://segmentfault.com/img/remote/1460000018194082); 原諒我的狂草字體,...
摘要:本文是圖說(shuō)系列文章的第五篇。這樣的話,使用的開(kāi)發(fā)者也不需要做任何適配,但是它們卻能獲得更高性能。該圖并不是用來(lái)準(zhǔn)確的衡量其性能的。運(yùn)行編寫(xiě)出高性能的代碼是可能的。這種清理工作由引擎自動(dòng)進(jìn)行,稱為垃圾回收。 本文是圖說(shuō) WebAssembly 系列文章的第五篇。如果您還未閱讀之前的文章,建議您從第一篇入手。 在上一篇文章中,我們說(shuō)到了使用 WebAssembly 和 JavaScript...
摘要:本文是圖說(shuō)系列文章的第四篇。它們表示一種可以在普遍流行機(jī)器上高效使用的指令集合。這是因?yàn)槭且环N稱為堆棧機(jī)器。盡管是根據(jù)堆棧機(jī)器來(lái)設(shè)計(jì)的,但是這并不是它在真實(shí)物理機(jī)器上工作的方式。這些內(nèi)容稱為段。 本文是圖說(shuō) WebAssembly 系列文章的第四篇。如果您還未閱讀之前的文章,建議您從第一篇入手。 WebAssembly 是一種使得除 JavaScript 以外的編程語(yǔ)言也能運(yùn)行在網(wǎng)頁(yè)上...
摘要:的主要組件包含了一個(gè)全新的引擎,稱為量子,也稱為。這個(gè)新引擎集成了四種不同瀏覽器的最新創(chuàng)新技術(shù),創(chuàng)造出一個(gè)全新的超級(jí)引擎。這可以發(fā)生在多個(gè)圖層上。最終,擁有最高特異性的規(guī)則會(huì)勝出。 原文:Inside a Super Fast CSS Engine: Quantum CSS(Aka Stylo), Lin Clark 注:原文發(fā)布于 2017 年 8 月,本文翻譯于 2018 年 4 ...
閱讀 1002·2021-11-24 10:30
閱讀 2327·2021-10-08 10:04
閱讀 3968·2021-09-30 09:47
閱讀 1452·2021-09-29 09:45
閱讀 1445·2021-09-24 10:33
閱讀 6271·2021-09-22 15:57
閱讀 2358·2021-09-22 15:50
閱讀 4089·2021-08-30 09:45