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