摘要:補(bǔ)充的知識(shí)這個(gè)是原型中的自帶屬性,指向構(gòu)造函數(shù)這個(gè)屬性其實(shí)是瀏覽器實(shí)現(xiàn)的,不是標(biāo)準(zhǔn)的訪問原型的方式中規(guī)定的正式方法是以上知識(shí),最終的圖如下思考題在文章開頭我們說過函數(shù)也是對(duì)象,既然是對(duì)象就有原型,那的原型指向誰呢是嗎
文章開頭說的話
首先你必須明白(或者記住)的JavaScript常識(shí):
在JavaScript中每個(gè)函數(shù)都有一個(gè)prototype屬性
在JavaScript中每個(gè)對(duì)象都有一個(gè)__proto__屬性
在JavaScript中函數(shù)是一等公民,即函數(shù)也是對(duì)象
prototype和__proto__prototype到底是個(gè)啥呢?下面看下這段代碼,我們慢慢來
// Animal是個(gè)構(gòu)造函數(shù),所以有prototype屬性 function Animal(){} // 在prototype上定義eat方法 Animal.prototype.eat = function(food){ console.log("it is eating " + food); } // 構(gòu)造函數(shù)實(shí)例化a1 const a1 = new Animal(); // 構(gòu)造函數(shù)實(shí)例化a2 const a2 = new Animal(); // 調(diào)用實(shí)例的方法 a1.eat("food"); a2.eat("food");
從上面的代碼中,我們可以看到:
函數(shù)的prototype指向一個(gè)對(duì)象
函數(shù)實(shí)例化后的對(duì)象可以獲取prototype指向?qū)ο蟮姆椒?和屬性)
那他們之前的關(guān)系是怎么樣的呢?
從圖中我們可以看到:
Animal的prototype指向一個(gè)對(duì)象
Animal的實(shí)例通過__proto__關(guān)聯(lián)到Animal的prototype指向的對(duì)象
用官方術(shù)語說,就是:
函數(shù)的prototype所指向的對(duì)象就是該函數(shù)創(chuàng)建的實(shí)例的原型(即:a2和a2的原型是Animal.prototype)
那么問題來了,什么是原型呢?
在JavaScript中,每個(gè)對(duì)象(null除外)在創(chuàng)建的時(shí)候都會(huì)與之關(guān)聯(lián)另外一個(gè)對(duì)象,對(duì)象和原型之間通過__proto__進(jìn)行關(guān)聯(lián)
在上面的代碼中,我們可以看到實(shí)例對(duì)象中并沒有eat方法,但是每個(gè)實(shí)例對(duì)象都可以調(diào)用eat方法,那中間的過程是怎樣的呢?
當(dāng)我們調(diào)用實(shí)例對(duì)象(a1和a2)的方法(eat)的時(shí)候,如果找到則直接調(diào)用實(shí)例對(duì)象的方法或者屬性;如果找不到,就會(huì)查找與之關(guān)聯(lián)的原型上是否有這個(gè)方法,如果這個(gè)原型沒有,就會(huì)繼續(xù)向上查找該原型的原型(原型的原型后面探討)
原型的原型在上面我們提到了如果在原型上找不到相應(yīng)的屬性或者方法,就會(huì)在原型的原型上查找,那么什么是原型的原型呢?
首先在文章開頭我們說每個(gè)對(duì)象都有原型,而原型也是對(duì)象,所以原型也是有原型的(聽起來有點(diǎn)繞)
那之前代碼的Animal.prototype的原型指向哪里呢(即Animal.prototype.__proto__)指向誰呢?這里Animal.prototype是JavaScript內(nèi)置構(gòu)造函數(shù)Object生成的呢,那是不是應(yīng)該指向Object.prototype呢?答案是是的。
那Object.prototype也是對(duì)象,它的原型呢?Object.prototype.__proto__指向哪個(gè)對(duì)象呢?答案是:null;即:
Object.prototype.__proto__ === null // true // 表示如果查找屬性的時(shí)候到Object.prototype時(shí)還是沒有就停止,沒有了
最后畫張圖:
注意到上圖中的藍(lán)色線條部分了嗎,這就是大名鼎鼎的原型鏈。
補(bǔ)充的知識(shí)constructor: 這個(gè)是原型中的自帶屬性,指向構(gòu)造函數(shù)
__proto__: 這個(gè)屬性其實(shí)是瀏覽器實(shí)現(xiàn)的,不是標(biāo)準(zhǔn)的訪問原型的方式;ES5中規(guī)定的正式方法是:Object.getPrototypeOffang"fa
Object.getPrototypeOf(a1) === Animal.prototype // true
以上知識(shí),最終的圖如下:
在文章開頭我們說過函數(shù)也是對(duì)象,既然是對(duì)象就有原型,那Animal的原型指向誰呢?
Function.prototype === Function.__proto__ 是true嗎?
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/102328.html
摘要:如果構(gòu)造函數(shù)有返回值呢一般情況下構(gòu)造函數(shù)沒有返回值,但是我們依舊可以得到該對(duì)象的實(shí)例如果構(gòu)造函數(shù)有返回值,憑直覺來說情況應(yīng)該會(huì)不一樣。歡迎光臨小弟博客我的博客原文你真的弄明白了嗎參考再談面向?qū)ο缶幊痰膶?shí)例化與繼承請(qǐng)停止使用關(guān)鍵字 好久沒有寫點(diǎn)東西了,總覺得自己應(yīng)該寫點(diǎn)牛逼的,卻又不知道如何下筆。既然如此,還是回歸最基本的吧,今天就來說一說這個(gè)new。關(guān)于javascript的new關(guān)鍵...
摘要:這正是我們想要的太棒了毫不意外的,這種繼承的方式被稱為構(gòu)造函數(shù)繼承,在中是一種關(guān)鍵的實(shí)現(xiàn)的繼承方法,相信你已經(jīng)很好的掌握了。 你應(yīng)該知道,JavaScript是一門基于原型鏈的語言,而我們今天的主題 -- 繼承就和原型鏈這一概念息息相關(guān)。甚至可以說,所謂的原型鏈就是一條繼承鏈。有些困惑了嗎?接著看下去吧。 一、構(gòu)造函數(shù),原型屬性與實(shí)例對(duì)象 要搞清楚如何在JavaScript中實(shí)現(xiàn)繼承,...
摘要:當(dāng)這步完成,這個(gè)對(duì)象就與構(gòu)造函數(shù)再無聯(lián)系,這個(gè)時(shí)候即使構(gòu)造函數(shù)再加任何成員,都不再影響已經(jīng)實(shí)例化的對(duì)象了。此時(shí),對(duì)象具有了和屬性,同時(shí)具有了構(gòu)造函數(shù)的原型對(duì)象的所有成員,當(dāng)然,此時(shí)該原型對(duì)象是沒有成員的。 前言 本篇文章用來記錄下最近研究對(duì)象的一些心得,做一個(gè)記錄與總結(jié),以加深自己的印象,同時(shí),希望也能給正在學(xué)習(xí)中的你一點(diǎn)啟發(fā)。本文適合有一定JavaScript基礎(chǔ)的童鞋閱讀。原文戳這...
摘要:標(biāo)準(zhǔn)對(duì)象,語義由本規(guī)范定義的對(duì)象。這意味著雖然有,本質(zhì)上依然是構(gòu)造函數(shù),并不能像那樣表演多繼承嵌套類等高難度動(dòng)作。不過這里的并不是我們所說的數(shù)據(jù)類型,而是對(duì)象構(gòu)造函數(shù)。 序 ECMAScript is an object-oriented programming language for performing computations and manipulating computat...
閱讀 3486·2021-10-18 13:30
閱讀 2941·2021-10-09 09:44
閱讀 1964·2019-08-30 11:26
閱讀 2287·2019-08-29 13:17
閱讀 757·2019-08-29 12:17
閱讀 2246·2019-08-26 18:42
閱讀 471·2019-08-26 13:24
閱讀 2951·2019-08-26 11:39