這篇文章主要 解決的問(wèn)題 是:什么是__proto__?什么是prototype?他們的關(guān)系是什么?在原型鏈中扮演什么角色?proto和prototype
prototype是函數(shù)的一個(gè)屬性,在定義構(gòu)造函數(shù)的時(shí)候自動(dòng)創(chuàng)建,它指向函數(shù)的原型,被 __proto__指向。這個(gè)原型對(duì)象里包含著自定義的方法屬性。
__proto__是對(duì)象的內(nèi)部屬性,它指向構(gòu)造器的prototype,對(duì)象依賴它來(lái)進(jìn)行原型鏈的查詢,instanceof方法也是依賴它來(lái)判斷是否存在繼承關(guān)系。
prototype只能作為構(gòu)造函數(shù)的屬性,而__proto__可以作為任意對(duì)象的屬性。
proto、prototype和原型鏈之間的聯(lián)系看一段代碼:
function Foo(name) { this.name = name }; Foo.prototype.age = 18; let student = new Foo("holy");
我們通過(guò)一張圖來(lái)表示這段代碼構(gòu)建的原型鏈:
這張圖中原型鏈可分成兩部分:
student ---> Foo.prototype ---> Object.prototype ---> null
Foo ---> Function.prototype ---> Object.prototype ---> null
我們從 對(duì)象student 看起:根據(jù) 概念3 , prototype 只能作為構(gòu)造函數(shù)的屬性,__proto__只能作為對(duì)象的屬性。所以對(duì)象sutdent 只有__proto__,沒(méi)有prototype。
student.prototype; undefined
而 student對(duì)象 是Foo構(gòu)造函數(shù)的一個(gè)實(shí)例,根據(jù) 概念2 它的__proto__指向Foo.prototype
student.__ptoto__ == Foo.prototype; true
以為 Foo.prototype 是一個(gè)對(duì)象,所以 Foo.prototype.__proto__指向 Object.prototype
Foo.prototype.__proto__ == Object.prototype; true
再來(lái)看第二部分:
Foo 是一個(gè)函數(shù),所以 Foo.__proto__指向 Function.prototype
Foo.__proto__ == Function.prototype true
再 JavaScript 中函數(shù)都是第一公民,而且函數(shù)也是對(duì)象,所以Function.prototype.__proto__指向 Object.prototype
Function.prototype.__proto__ == Object.prototype true原型鏈的工作流程
student.name 在student中找到 name屬性,返回“holy”;
student.age 在student中未找到,于是通過(guò)student.__proto__在Foo.prototype中找到,返回 18;
student.toString() 在student中未找到,接著通過(guò)student.__proto__在Foo.prototype中尋找,未找到,繼續(xù)通過(guò)Foo.prototype.__proto__在Object.prototype中尋找,找到了,返回‘[object object]’。
student.getWeight() 依次在student、Foo.prototype、Object.prototype中尋找,均未找到,拋出錯(cuò)誤。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/92429.html
摘要:深入理解原型與繼承看過(guò)不少書(shū)籍,不少文章,對(duì)于原型與繼承的說(shuō)明基本上讓人不明覺(jué)厲,特別是對(duì)于習(xí)慣了面向?qū)ο缶幊痰娜藖?lái)說(shuō)更難理解,這里我就給大家說(shuō)說(shuō)我的理解。 深入理解:JavaScript原型與繼承 看過(guò)不少書(shū)籍,不少文章,對(duì)于原型與繼承的說(shuō)明基本上讓人不明覺(jué)厲,特別是對(duì)于習(xí)慣了面向?qū)ο缶幊痰娜藖?lái)說(shuō)更難理解,這里我就給大家說(shuō)說(shuō)我的理解。 首先JavaScript是一門基于原型編程的語(yǔ)言...
摘要:屬性這是每個(gè)對(duì)象都有的隱式原型屬性,指向了創(chuàng)建該對(duì)象的構(gòu)造函數(shù)的原型。 原型 在JavaScript中,有兩個(gè)原型,分別是 prototype 和 _proto_注:在ECMA-262第5版中管這個(gè) _proto_ 叫 [[Prototype]] prototype 屬性:這是一個(gè)顯式原型屬性,只有函數(shù)才擁有該屬性。_proto_ 屬性:這是每個(gè)對(duì)象都有的隱式原型屬性,指向了創(chuàng)建該對(duì)象...
摘要:寫(xiě)在前面如果說(shuō)是一本武學(xué)典籍,那么原型鏈就是九陽(yáng)神功。那么,如何修煉好中的九陽(yáng)神功呢真正的功法大成的技術(shù)是從底層上去理解,那種工程師和碼農(nóng)的區(qū)別就在于對(duì)底層的理解,當(dāng)你寫(xiě)完一行代碼,或者你遇見(jiàn)一個(gè)解決的速度取決于你對(duì)底層的理解。 寫(xiě)在前面 如果說(shuō)JavaScript是一本武學(xué)典籍,那么原型鏈就是九陽(yáng)神功。在金庸的武俠小說(shuō)里面,對(duì)九陽(yáng)神功是這樣描述的:練成「九陽(yáng)神功」后,會(huì)易筋洗髓;生出...
摘要:寫(xiě)在前面如果說(shuō)是一本武學(xué)典籍,那么原型鏈就是九陽(yáng)神功。那么,如何修煉好中的九陽(yáng)神功呢真正的功法大成的技術(shù)是從底層上去理解,那種工程師和碼農(nóng)的區(qū)別就在于對(duì)底層的理解,當(dāng)你寫(xiě)完一行代碼,或者你遇見(jiàn)一個(gè)解決的速度取決于你對(duì)底層的理解。 寫(xiě)在前面 如果說(shuō)JavaScript是一本武學(xué)典籍,那么原型鏈就是九陽(yáng)神功。在金庸的武俠小說(shuō)里面,對(duì)九陽(yáng)神功是這樣描述的:練成「九陽(yáng)神功」后,會(huì)易筋洗髓;生出...
閱讀 2041·2021-11-24 09:39
閱讀 1901·2019-08-30 15:55
閱讀 2195·2019-08-30 15:53
閱讀 620·2019-08-29 13:16
閱讀 1009·2019-08-26 12:20
閱讀 2411·2019-08-26 11:58
閱讀 3176·2019-08-26 10:19
閱讀 3339·2019-08-23 18:31