国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

看完這篇,再也不會害怕別人問我什么是原型了

開發 前端
原型、原型鏈應該是被大多數前端er說爛的詞,但是應該還有很多人不能完整的解釋這兩個內容,當然也包括我自己。

[[384901]]

本文轉載自微信公眾號「不知名寶藏程序媛」,作者小土豆 。轉載本文請聯系不知名寶藏程序媛公眾號。  

 前言

原型、原型鏈應該是被大多數前端er說爛的詞,但是應該還有很多人不能完整的解釋這兩個內容,當然也包括我自己。

最早一篇原型鏈文章寫于2019年07月,那個時候也是費了老大勁才理解到了七八成,到現在基本上忘的差不多了。時隔兩年,興趣所向重新開始復盤一下原型和原型鏈的內容。

JavaScript中的對象

在JavaScript中,對象被稱為是一系列屬性的集合。

創建對象的方式也有很多種,最常見的一種就是雙花括號的形式:

  1. var obj = {}; 
  2. obj.name = '小土豆'
  3. obj.age  = 18; 

這種方式實際上是下面這種方式的語法糖:

  1. var obj = new Object(); 
  2. obj.name = '小土豆'
  3. obj.age  = 18; 

除此之外,在JavaScript中也可以通過構造函數自定義對象。

  1. function Cat(){} 
  2. var catMimi = new Cat();  // 自定義對象 

如果一個函數使用new關鍵字調用,那么這個函數就可以稱為是構造函數,否則就是普通函數。

什么是原型

一句話簡單總結原型:原型是一個對象。

在后面的總結中,原型可能會被描述為原型對象,其等價于原型

原型從哪里來?原型這個對象存在于哪里,需要通過代碼去創建嗎?

我們說對象是一系列屬性的集合,那原型這個對象包含什么屬性呢?

如何操作和使用原型?

接下來我們一個一個問題去探究。

▣ 原型從哪里來

JavaScript會為所有的函數創建一個原型。

  1. function Cat(){} 

上面的代碼中我們創建了一個Cat函數,那這個Cat函數就有一個原型,用代碼表示就是:Cat.prototype。

同樣我們創建一個函數Fn1,函數Fn1就有一個原型,用代碼表示就是Fn1.prototype。

函數名稱的大寫和小寫本質上沒有任何區別

▣ 原型包含哪些屬性

前面我們說過以下這兩點:

原型是一個對象

對象是一系列屬性的集合

那原型都包含哪些屬性呢?

前面我們已經知道原型用代碼表示就是:functionName.prototype,那我們在代碼中console.log一下。

  1. function Cat(){} 
  2. console.log("Cat.prototype:"); 
  3. console.log(Cat.prototype); 
  4.  
  5. function Dog(){} 
  6. console.log("Dog.prototype:"); 
  7. console.log(Dog.prototype); 

Firefox瀏覽器中的輸出結果如下:

可以看到函數的原型默認有兩個屬性:constructor和

其中,函數原型的constructor屬性指向函數本身。

函數原型的 屬性稱為隱式原型,后面我們會分出一節單獨介紹隱式原型。

▣ 如何操作和使用原型

正常我們操作一個普通對象的方式是下面這樣的:

  1. var obj = {};          // 創建對象 
  2. obj.name = '小土豆';    // 為對象添加屬性 
  3. obj.age = 18;          // 為對象添加屬性 
  4. var name = obj.name;   // 訪問對象屬性 

原型既然也是一個對象,所以操作原型的方式和上述的方式相同。

  1. function Cat(){} 
  2. Cat.prototype.type = 'cat'
  3. Cat.prototype.color = 'White'
  4. Cat.prototype.sayInfo = function(){ 
  5.     console.log(this.type + ' is ' + this.color); 

此時再次打印Cat.prototype就能看到我們添加到原型上的屬性:

訪問原型對象上的方法和屬性:

以上這些操作原型的方法,對于真正的項目開發并沒有什么參考價值,不過不用著急,后面我們會詳細講解

隱式原型

前面我們在總結函數的原型對象時提到過隱式原型。

那實際上,JavaScript會為所有的對象創建叫隱式原型的屬性。我們一直說原型是一個對象,所以在上面的截圖中,原型也有一個隱式原型屬性。

▣ 隱式原型的代碼表示

隱式原型

是對象的私有屬性,在代碼中可以這樣訪問:obj.__proto__。

obj.__proto__這種寫法是非標準的,一些低版本的瀏覽器并不支持這樣的寫法

我們在瀏覽器的控制臺中實際訪問一下:

從打印的結果可以看到隱式原型也是一個對象,那隱式原型這個對象里面又包含什么屬性呢?下面我們一起來看看。

▣ 隱式原型存在的意義

首先我們寫一個簡單的示例:

  1. function Cat(){} 
  2. var catMimi = new Cat(); 
  3. var catJuju = new Cat(); 

在上面這段代碼中,我們創建了一個Cat函數,并且通過new關鍵字創建了以Cat為構造函數的兩個實例對象catMimi和catJuju。

接下來我們在瀏覽器的console工具中看看這兩個實例對象的隱式原型都包含了那些屬性。

可以看到,catMimi.__proto__和catJuju._proto__的結果貌似是一樣的,而且眼尖的同學應該也發現了這個打印結果似乎和前面一節【原型包含那些屬性】中打印的Cat.prototype是一樣的。

那話不多說,我們用==運算符判斷一下即可:

可以看到所有的判斷結果均為true。

由于對象catMimi、catJuJu都是由Cat函數創建出來的實例,所以總結出來結論就是:對象的隱式原型__proto__指向創建該對象的函數的原型對象。

原型鏈:原型和隱式原型存在的意義

前面我們總結了原型、隱式原型的概念以及如何使用代碼操作原型和隱式原型,總的看來原型和隱式原型好像也沒有特別厲害的地方,它們到底有什么用呢?

▣ 所有的實例對象共享原型上定義的屬性和方法

我們來看下面這樣一個示例:

  1. function Cat(name, age){ 
  2.     this.type = 'RagdollCat';  //布偶貓 
  3.     this.eyes = 2; 
  4.     this.name = name
  5.     this.age = age; 
  6.     this.sayInfo = function(){ 
  7.         console.log(this.type + ' ' + this.name + ' is ' + this.age + ' years old'); 
  8.     } 

在這個示例中,我們創建了一個Cat函數,同時Cat函數有五個屬性:type、eyes、name、age、sayInfo,其中type和eyes屬性已經有了初始值,而name、age通過參數傳遞并賦值;sayInfo對應是一個函數,打印出type、name和age的值。

接著我們創建Cat的兩個實例對象catMimi、catJuju,并傳入不同的name和age參數。

  1. var catMimi = new Cat('Mimi', 1); 
  2. var catJuju = new Cat('Juju', 2); 

控制臺查看一下我們創建的對象:

可以看到這兩個對象有著相同的屬性,由于type、eyes是在Cat函數創建時已經有了固定的初始值,所以這兩個屬性值是相同的;sayInfo函數也都是相同的功能,打印出一些屬性的信息;只有name、age是通過參數傳遞的,各自的值不相同。除此之外呢,catMimi和catJuju是兩個不同的對象,兩者的屬性值互相獨立,修改其中任意一個的屬性值并不會影響另外一個對象的屬性值。

假如之后我們有更多這樣的對象,JavaScript還是會為每一個對象創建相同的屬性,而這些所有的對象都擁有著相同的type、eyes屬性值和相同功能的sayInfo函數。這無疑造成了內存浪費,那這個時候我們就可以將這些屬性定義到函數的原型對象上:

  1. function Cat(name, age){ 
  2.     this.name = name
  3.     this.age = age; 
  4.  
  5. Cat.prototype.type = 'RagdollCat';    //布偶貓 
  6. Cat.prototype.eyes = 2; 
  7. Cat.prototype.sayInfo = function(){ 
  8.     console.log(this.type + ' ' + this.name + ' is ' + this.age + ' years old'); 
  9. var catMimi = new Cat('Mimi', 1); 
  10. var catJuju = new Cat('Juju', 2); 

然后我們再來看看這兩個對象:

可以看到這兩個對象現在只包含了兩個屬性,就是Cat構造函數內容內部定義的兩個屬性:name、age。

接著我們在去訪問對象上的type、eyes和sayInfo:

我們的實例對象還是可以正常訪問到屬性,方法也打印出來正確的信息。那到底是怎么訪問到的呢?

▣ 原型鏈

在上一個示例代碼中,我們將一些屬性和方法定義到函數的原型上,最后使用該函數創建出來的實例對象可以正常訪問原型上定義的屬性和方法,這是怎么做到的呢?

前面我們說過:對象的隱式原型指向創建該對象的函數的原型對象,所以當實例對象中沒有某個屬性時,JavaScript就會沿著該實例對象的隱式原型去查找,這便是我們所說的原型鏈。

那既然是鏈,我們想到的應該是一個連著一個的東西,所以應該不僅僅是當前實例對象的隱式原型指向創建該對象的函數的原型對象,所以我們在對catMimi對象做點操作:

在上面的操作,我們調用了catMimi的hasOwnProperty方法,很明顯我們并沒有為這個對象定義該方法,那這個方法從哪里來呢?

答案依然是原型鏈:

  • 調用catMimi.hasOwnProperty()方法
  • 在實例對象catMimi中查找屬性,發現沒有該屬性
  • 去catMimi.__proto__中查找,因為catMimi.__proto__=Cat.prototype(實例對象的隱式原型指向創建該實例的函數的原型),也就是在Cat.prototype中查找hasOwnProperty屬性,很明顯Cat.prototype也沒有該屬性
  • 于是繼續沿著Cat.prototype.__proto__查找,又因為Cat.prototype.__proto__ = Object.prototype(我們一直在強調原型是一個對象,既然是對象,就是由Object函數創建的,所以Cat.prototype的隱式原型指向Object函數的原型)

我們打印一下Object.prototype的是否包含hasOwnProperty屬性:

可以看到,Object.prototype中存在hasOwnProperty屬性,所以catMimi.hasOwnPrototype實際上調用的是Object.prototype.hasOwnProperty。

 

總結

本篇文章到此基本就基本結束了,相信大家應該對原型和原型鏈有了一定的了解。最后呢,我們在對本篇文章做一個總結。

圖片

 原文鏈接:https://mp.weixin.qq.com/s/59p32Xe03YCGhP2uTBjTUg

 

責任編輯:武曉燕 來源: 不知名寶藏程序媛
相關推薦

2021-05-08 07:53:33

面試線程池系統

2024-02-26 00:00:00

Docker容器

2018-08-29 14:56:42

SSD接口固態硬盤

2018-02-07 08:01:20

windows微軟windows 10

2018-03-16 10:34:56

Android P預覽版谷歌

2021-06-04 12:05:03

Redis Bitmap 數據庫

2021-01-07 05:26:15

Hive排序操作

2021-10-29 13:40:36

Python Gif 工具

2025-04-15 08:25:00

網絡分層網絡分層模型網絡

2020-12-10 10:20:32

CentOS 8RHELLinux

2019-04-08 17:04:23

安卓安卓手機谷歌

2020-05-07 09:05:22

電腦Python代碼

2022-07-01 13:38:48

霧計算邊緣計算

2025-06-17 10:00:00

函數重載函數重寫C++

2020-12-18 13:35:41

人工智能機器學習算法

2020-01-21 21:15:16

WiFi網絡WiFi6

2025-06-18 08:00:00

編程C++static

2017-10-24 10:54:28

網絡安全手機微信、支付寶

2022-12-13 09:59:25

計算遷移

2024-08-26 00:01:00

前端性能優化
點贊
收藏

51CTO技術棧公眾號

久久国产精品久久国产精品| 日韩a在线播放| 午夜啪啪免费视频| 在线观看国产中文字幕| 五月综合网站| 91亚洲精品| 欧美久久免费观看| 免费看的毛片| 夜夜精品浪潮av一区二区三区| 欧美成人精品激情在线观看 | 亚洲高清乱码| 在线观看视频网站你懂得| 免费在线午夜视频| 欧美一区二区三区久久精品茉莉花| 国产精品亚洲专一区二区三区| 欧美久久久久免费| 亚洲三区在线| 亚洲国产影院| 精品国模在线视频| 福利在线导航136| 欧美日韩国产中文| 阿v免费在线观看| 欧美综合在线视频| 免费av网站在线看| 在线免费观看日韩欧美| 日本三级在线观看网站| 日本不卡视频一区二区| 成年人三级视频| 色八戒一区二区三区| www.亚洲激情.com| 99r国产精品视频| 久久99伊人| av高清在线免费观看| 久久亚洲综合色一区二区三区| 中文字幕在线观看第三页| 亚洲图片你懂的| 成人免费在线电影| 欧美成人官网二区| 北岛玲精品视频在线观看| 国产精品久久久久77777| 99亚洲视频| 草b视频在线观看| 亚洲在线成人精品| 大地资源网3页在线观看| 欧美成人激情视频免费观看| 免费视频成人| 91久久精品美女| 福利视频网站一区二区三区| 99不卡视频| 日韩成人xxxx| 亚洲欧美综合久久久| 国产乱淫av片杨贵妃| 欧美丝袜第一区| 欧美三级精品| 狠狠色噜噜狠狠色综合久| 北岛玲一区二区三区四区| 国产传媒视频在线观看| 日韩毛片在线看| 欧美残忍xxxx极端| 妺妺窝人体色www在线观看| 一本色道久久综合狠狠躁的推荐| av丝袜在线| 国产成人免费观看| 亚洲图片激情小说| 欧美亚洲人成在线| 青青草原网站在线观看| 一本到不卡免费一区二区| 久久91麻豆精品一区| 日本三区在线观看| 欧美成人亚洲成人日韩成人| 国产美女娇喘av呻吟久久| 91xxx在线观看| 国产精品久久久久久久久免费看| 欧美国产美女| 国产欧美在线一区| 一区二区三区视频在线| 麻豆免费精品视频| 好看的中文字幕在线播放| 免费观看成人高| 88在线观看91蜜桃国自产| 亚洲午夜一级| 毛片在线播放a| 日韩欧美99| 在线播放日韩精品| 99riav久久精品riav| 日韩激情欧美| 日本人视频jizz页码69| 欧美人与性动交| 亚洲一二三四在线观看| 精品99在线| 亚洲一区二区免费视频| 7777精品伊人久久久大香线蕉的 | 成人爽a毛片免费啪啪红桃视频| 亚洲丝袜精品丝袜在线| 18禁免费无码无遮挡不卡网站| 国产裸体歌舞团一区二区| av大片在线| 玛丽玛丽电影原版免费观看1977 | 国产91九色视频| 在线视频日韩| av高清一区| 高清视频在线www色| 一区二区亚洲精品国产| 欲香欲色天天天综合和网| 日韩欧美国产一区在线观看| 欧美三级电影在线| 亚洲一区亚洲二区| 成人av一区二区三区| 国产色a在线| 精品国产在天天线2019| 国产精品成人a在线观看| xxxx影院| 久久久精品欧美| 国产东北露脸精品视频| √天堂8资源中文在线| 国产欧美日韩亚洲| 91精品国产高清一区二区三区 | 国产精品传媒视频| 免费看成年人视频在线观看| 欧美成人乱码一区二区三区| 99精品综合| mm131国产精品| 色悠悠国产精品| 欧美一级专区| 日韩精品一区二区三区色欲av| 日韩一区二区在线看片| 在线视频精品| 中文字幕在线二区| 欧美成人国产va精品日本一级| 日韩高清不卡一区二区| 男人的天堂在线| 欧美激情区在线播放| 色综合久久天天| 亚洲高清网站| 青草久久伊人| 国产传媒久久久| 亚洲欧美一区二区三区四区| 亚洲看片免费| 狂野欧美性猛交xxxx| 国产一区二区在线免费播放| 精品福利在线导航| 亚洲午夜伦理| 少妇激情一区二区三区| 欧美伦理影视网| 日韩经典一区二区三区| 午夜在线播放视频欧美| 毛片av在线| 青青草视频在线免费播放| 国产精品高潮呻吟久久av野狼| 伊人天天久久大香线蕉av色| 污视频网站在线看| 欧美另类中文字幕| 精品一区二区三区蜜桃| 亚洲国产电影在线观看| 久久久99久久| 99精品视频在线观看免费| 黄色日韩精品| 亚洲五码在线| 综合日韩在线| 亚洲第一av色| 在线观看国产成人av片| 国产精品第8页| 成人三级在线| 国产精品69久久久久| 一区二区在线免费| 国产一区亚洲| 久久亚洲道色| 日本福利在线观看| 奇米888一区二区三区| 欧美成人精品在线视频| 亚洲欧美日韩在线高清直播| 国产精品三级在线观看| 在线看片不卡| 凹凸av导航大全精品| 国产三级免费观看| 免费无遮挡无码永久视频| 真实原创一区二区影院| 欧美性色综合网| 国产精品久久久久久久岛一牛影视 | 亚洲第一免费播放区| 欧美激情综合网| 国产午夜精品一区二区三区嫩草| 疯狂做受xxxx高潮欧美日本 | 激情综合色播五月| 亚洲精品第1页| 亚洲天堂精品在线观看| 亚洲欧美在线另类| 欧美日韩三级一区| 国产在线视频在线| 亚洲国产裸拍裸体视频在线观看乱了中文| aaa大片免费观看| 男人亚洲天堂网| 日韩欧美国产黄色| 99久久激情视频| 国产成人在线小视频| 国产精品视频公开费视频| 最近2019中文字幕第三页视频| 日韩天堂在线观看| 欧美一级国产精品| 欧美大片一区二区|