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