摘要:構(gòu)造函數(shù)的屬性指向原型對象原型對象的屬性指向構(gòu)造函數(shù)實例對象的指向原型對象所有引用類型默認(rèn)都繼承了,而這個繼承也是通過原型鏈實現(xiàn)的。第一種方式是使用操作符,只要用這個操作符來測試實例與原型鏈中出現(xiàn)過的構(gòu)造函數(shù),結(jié)果就會返回。
理解對象
首先對象的定義是:“無序?qū)傩缘募希鋵傩钥梢园局怠ο蠡蛘吆瘮?shù)。”嚴(yán)格來講,
這就相當(dāng)于說對象是一組沒有特定順序的值。對象的每個屬性或方法都有一個名字,而每個名字都映射到一個值。正因為這樣(以及其他將要討論的原因),我們可以把 ECMAScript 的對象想象成散列表:無非就是一組名值對,其中值可以是數(shù)據(jù)或函數(shù)。
原型對象理解
1.創(chuàng)建的每個函數(shù)都有一個 prototype(原型)屬性,這個屬性是一個指針,指向一個對象(原型對象), 而原型對象的用途是包含可以由特定類型的所有實例共享的屬性和方法。
2.創(chuàng)建一個新函數(shù),會根據(jù)一組特定的規(guī)則為該函數(shù)創(chuàng)建一個 prototype 屬性(原型屬性),這個屬性指向函數(shù)的原型對象。在默認(rèn)情況下,所有原型對象都會自動獲得一個 constructor (構(gòu)造函數(shù)屬性)屬性,這個屬性包含一個指向 prototype 屬性所在函數(shù)的指針。就拿前面的例子來說, Person.prototype.constructor 指向 Person。而通過這個構(gòu)造函數(shù),我們還可繼續(xù)為原型對象添加其他屬性和方法
3.當(dāng)調(diào)用構(gòu)造函數(shù)創(chuàng)建一個新實例后,該實例的內(nèi)部將包含一個指針(內(nèi)部 屬性),指向構(gòu)造函數(shù)的原型對象。ECMA-262 第 5 版中管這個指針叫[[Prototype]]。雖然在腳本中 沒有標(biāo)準(zhǔn)的方式訪問[[Prototype]],但 Firefox、Safari 和 Chrome 在每個對象上都支持一個屬性 proto;而在其他實現(xiàn)中,這個屬性對腳本則是完全不可見的。不過,要明確的真正重要的一點就 是,這個連接存在于實例與構(gòu)造函數(shù)的原型對象之間,而不是存在于實例與構(gòu)造函數(shù)之間。Person 的每個實例—— person1 和 person2 都包含一個內(nèi)部屬性,該屬性僅僅指向了 Person.prototype;換句話說,它們 與構(gòu)造函數(shù)沒有直接的關(guān)系。
4.實現(xiàn)中都無法訪問到[[Prototype]],
1>但可以通過 isPrototypeOf()方法來確定對象之間是否存在這種關(guān)系。
2>ECMAScript 5增加了一個新方法,叫Object.getPrototypeOf(),在所有支持的實現(xiàn)中,這個方法返回[[Prototype]]的值。例如:
理解prototype、__proto__與constructor
1>__proto__和constructor屬性是對象所獨有的;prototype屬性是函數(shù)所獨有的,因為函數(shù)也是一種對象,所以函數(shù)也擁有__proto__和constructor屬性。 2>__proto__屬性的作用就是當(dāng)訪問一個對象的屬性時,如果該對象內(nèi)部不存在這個屬性,那么就會去它的__proto__屬性所指向的那個對象(父對象)里找,一直找,直到__proto__屬性的終點**null**,然后返回undefined,再往上找就相當(dāng)于在null上取值,會報錯。通過__proto__屬性將對象連接起來的這條鏈路即我們所謂的**原型鏈**。 3>prototype屬性的作用就是讓該函數(shù)所**實例化的對象**們都可以找到公用的屬性和方法,即f1.__proto__ === Foo.prototype。 4>constructor屬性的含義就是指向該**對象的構(gòu)造函數(shù)**,所有函數(shù)(此時看成對象了)最終的構(gòu)造函數(shù)都指向Function。
原型鏈
原型鏈?zhǔn)菍崿F(xiàn)繼承的主要方法。其基本思想是利用原型讓一個引用類型繼承另一個引用類型的屬性和方法。
(構(gòu)造函數(shù))的prototype屬性指向(原型對象);
(原型對象)的constructor屬性指向(構(gòu)造函數(shù));
(實例對象)的[[Prototype]]/__proto__指向(原型對象)
1.所有引用類型默認(rèn)都繼承了 Object,而 這個繼承也是通過原型鏈實現(xiàn)的。大家要記住,所有函數(shù)的默認(rèn)原型都是 Object 的實例,因此默認(rèn)原 型都會包含一個內(nèi)部指針,指向 Object.prototype。這也正是所有自定義類型都會繼承 toString()、 valueOf()等默認(rèn)方法的根本原因。所以,我們說上面例子展示的原型鏈中還應(yīng)該包括另外一個繼承層次
確定原型和實例的關(guān)系
可以通過兩種方式來確定原型和實例之間的關(guān)系。第一種方式是使用 instanceof 操作符,只要用 這個操作符來測試實例與原型鏈中出現(xiàn)過的構(gòu)造函數(shù),結(jié)果就會返回 true。以下幾行代碼就說明了這 一點。
由于原型鏈的關(guān)系,我們可以說 instance 是 Object、SuperType 或 SubType 中任何一個類型 的實例。因此,測試這三個構(gòu)造函數(shù)的結(jié)果都返回了 true。
第二種方式是使用 isPrototypeOf()方法。同樣,只要是原型鏈中出現(xiàn)過的原型,都可以說是該 原型鏈所派生的實例的原型,因此 isPrototypeOf()方法也會返回 true,如下所示。
參考文章
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/110165.html
摘要:之前有朋友問怎么去理解原型和原型鏈的問題。理解原型鏈的小技巧將箭頭視作泛化子類到父類關(guān)系那么圖中所有的虛線將構(gòu)成一個繼承層級,而實線表示屬性引用。原型鏈?zhǔn)菍崿F(xiàn)繼承的重要方式,原型鏈的形成是真正是靠而非。 之前有朋友問怎么去理解原型和原型鏈的問題。這個問題,在面試中,很多同學(xué)經(jīng)常都會遇到。這里給大家講講,方便大家記憶。 JavaScript的特點JavaScript是一門直譯式腳本...
摘要:之前有朋友問怎么去理解原型和原型鏈的問題。理解原型鏈的小技巧將箭頭視作泛化子類到父類關(guān)系那么圖中所有的虛線將構(gòu)成一個繼承層級,而實線表示屬性引用。原型鏈?zhǔn)菍崿F(xiàn)繼承的重要方式,原型鏈的形成是真正是靠而非。 之前有朋友問怎么去理解原型和原型鏈的問題。這個問題,在面試中,很多同學(xué)經(jīng)常都會遇到。這里給大家講講,方便大家記憶。 JavaScript的特點JavaScript是一門直譯式腳本...
摘要:探索是如何判斷的表達(dá)式如果函數(shù)的顯式原型對象在對象的隱式原型鏈上,返回,否則返回是通過自己產(chǎn)生的實例案例案例重要注意的顯示原型和隱式原型是一樣的。面試題測試題測試題報錯對照下圖理解 原型與原型鏈深入理解(圖解) 原型(prototype) 函數(shù)的 prototype 屬性(圖) 每個函數(shù)都有一個prototype屬性,它默認(rèn)指向一個Object空對象(即稱為:原型對象) 原型對象中有...
摘要:先來一個構(gòu)造函數(shù)構(gòu)造一個人類實例化一個對象看看的名字是什么打印結(jié)果先說一個前提只要是函數(shù),就會有一個屬性,可以理解為子代的原型遺傳基因只要是對象,就會有一個方法,可以理解為向上尋找原型的方法。 關(guān)于javascript中的原型和原型鏈 我GitHub上的菜鳥倉庫地址: 點擊跳轉(zhuǎn)查看其他相關(guān)文章 文章在我的博客上的地址: 點擊跳轉(zhuǎn) ? ? ? ? 關(guān)于javascript中的原型和原...
摘要:參考內(nèi)容關(guān)于本文本文轉(zhuǎn)自大叔的深入理解系列深入理解系列文章,包括了原創(chuàng),翻譯,轉(zhuǎn)載,整理等各類型文章,原文是大叔的一個非常不錯的專題,現(xiàn)將其重新整理發(fā)布。 前言 JavaScript 不包含傳統(tǒng)的類繼承模型,而是使用 prototypal 原型模型。 雖然這經(jīng)常被當(dāng)作是 JavaScript 的缺點被提及,其實基于原型的繼承模型比傳統(tǒng)的類繼承還要強大。實現(xiàn)傳統(tǒng)的類繼承模型是很簡單,但是...
閱讀 1032·2021-11-25 09:43
閱讀 1413·2021-11-18 10:02
閱讀 1814·2021-11-02 14:41
閱讀 2366·2019-08-30 15:55
閱讀 1066·2019-08-29 16:18
閱讀 2552·2019-08-29 14:15
閱讀 1390·2019-08-26 18:13
閱讀 733·2019-08-26 10:27