成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

讓 JavaScript 區別于其它語言的是什么?原型繼承!

開發 前端
只有了解了原型繼承,你才能說你懂 JS,原型影響著對象的工作方式。原型繼承經常會在面試中被問到,因為這個面試官可以看出你對 JS 的了解程度。

[[354658]]

只有了解了原型繼承,你才能說你懂 JS,原型影響著對象的工作方式。原型繼承經常會在面試中被問到,因為這個面試官可以看出你對 JS 的了解程度。

本文,主要是幫助大家能夠更好的理解 JS 中的原型。

1.簡介

JavaScript 僅具有基本類型,null,undefined和object。JS 和Java或PHP等語言相反,沒有類的概念可以用作創建對象的模板。

對象是可組合的結構,由多個屬性組成:鍵和值對。

例如,以下對象cat包含2個屬性:

  1. const cat = { sound: 'Meow!', legs: 4 }; 

由于我想在其他對象中重用legs屬性,因此讓我們將legs屬性提取到專門的對象pet中

  1. const pet = { legs: 4 };  
  2. const cat = { sound: 'Meow!' }; 

看起來還不錯!

但是我仍然想讓cat擁有legs的屬性。如何將cat與pet聯系起來?

繼承可以幫助我們!

2. 原型對象

在 JS 中,一個對象可以繼承另一個對象的屬性。繼承屬性的對象被稱為 prototype,也就是原型。

按照改定義,我們可以讓pet作為 cat的原型,該原型將繼承legs屬性。使用對象字面量創建對象時,也可以使用特殊屬性__proto__設置所創建對象的原型。

  1. const pet = { legs: 4 }; 
  2.  
  3. const cat = { sound: 'Meow!', __proto__: pet }; 
  4.  
  5. cat.legs; // => 4 

cat 對象現在從原型pet繼承了legs 。現在,我們可以使用cat.legs,其值為4。

另一方面,sound 屬性是一個自有屬性,因為它是直接在對象上定義的。

JavaScript 原型繼承本質:對象可以從其他對象(原型)繼承屬性。

你可能想知道:為什么首先需要繼承?

繼承解決了數據和邏輯重復的問題。通過繼承,對象可以共享屬性和方法。

  1. const pet = { legs: 4 }; 
  2.  
  3. const cat = { sound: 'Meow!', __proto__: pet }; 
  4. const dog = { sound: 'Bark!', __proto__: pet }; 
  5. const pig = { sound: 'Grunt!', __proto__: pet }; 
  6.  
  7. cat.legs; // => 4 
  8. dog.legs; // => 4 
  9. pig.legs; // => 4 

cat,dog和pig 都重復使用了屬性legs。

注意:__proto__已過時,但為了簡單起見,我使用它。在生產環境中,建議使用Object.create()。

2.1 自有與繼承的屬性

如果對象自己的屬性和繼承屬性名稱一樣,JS 會優先選擇自有屬性。

在以下示例中,chicken對象具有自己的屬性legs,但還繼承了具有相同名稱legs的屬性:

  1. const pet = { legs: 4 }; 
  2.  
  3. const chicken = { sound: 'Cluck!', legs: 2, __proto__: pet }; 
  4.  
  5. chicken.legs; // => 2 

cat 對象從原型pet繼承了legs 。現在,您可以使用屬性訪問器cat.legs,其值為4。

chicken.legs的值為2。JavaScript在繼承上選擇自有屬性legs 。

如果刪除自有屬性,則 JS 會選擇繼承的屬性!

  1. const pet = { legs: 4 }; 
  2.  
  3. const chicken = { sound: 'Cluck!', legs: 2, __proto__: pet }; 
  4.  
  5. chicken.legs; // => 2 
  6. delete chicken.legs; 
  7. chicken.legs; // => 4 

3.隱式原型

創建對象時,未明確設置原型,JS 會為我們創建的對象類型分配一個隱式原型。

我們再來看看pet對象

  1. const pet = { legs: 4 }; 
  2.  
  3. pet.toString(); // => `[object Object]` 

pet只有一個屬性legs,但是,我們可以調用方法pet.toString()。這個toString()哪里來的?

創建pet 對象后,JS 為其分配了一個隱式原型對象。pet從這個隱式原型中繼承了toString()方法:

Object.getPrototypeOf() 方法返回指定對象的原型(內部[[Prototype]]屬性的值)。

4. 原型鏈

我們再創建tail 對象,讓他也成為pet的原型:

  1. const tail = { hasTail: true }; 
  2.  
  3. const pet = { legs: 4, __proto__: tail }; 
  4.  
  5. const cat = { sound: 'Meow!', __proto__: pet }; 
  6.  
  7. cat.hasTail; // => true 

cat從它的原型pet繼承了legs 的屬性。但是cat也從其原型的原型tail 繼承了hasTail 。

訪問屬性myObject.myProp時,JS 會在myObject自身的屬性內,對象的原型,原型的原型中依次搜索myProp,以此類推,直到遇到null作為原型。

換句話說,JavaScript在原型鏈中尋找繼承的屬性。

5. 但 JavaScript有類

從剛開始講的 JS 只有對象,沒有類,你可能就已經感到困惑,你在說什么鬼。這可能是因為在 ES6 中 你已經開始使用class關鍵字了。

例如,你可以編寫一個Pet類:

  1. class Pet { 
  2.   legs = 4; 
  3.  
  4.   constructor(sound) { 
  5.     this.sound = sound; 
  6.   } 
  7.  
  8. const cat = new Pet('Moew!'); 
  9.  
  10. cat.legs;           // => 4 
  11. cat instanceof Pet; // => true 

并在實例化該類時創建cat 。

其實 ,JS 中的class 語法是原型繼承之上的語法糖。

上面的基于類的代碼片段等效于以下內容:

  1. const pet = { 
  2.   legs: 4 
  3. }; 
  4.  
  5. function CreatePet(sound) { 
  6.   return { sound, __proto__: pet }; 
  7. CreatePet.prototype = pet; 
  8.  
  9. const cat = CreatePet('Moew!'); 
  10.  
  11. cat.legs;                 // => 4 
  12. cat instanceof CreatePet; // => true 

CreatePet.prototype = pet賦值是使cat instanceof CreatePet值為true所必需的。

6.總結

在JavaScript中,對象從其他對象(原型)繼承屬性,這就是原型繼承的一個概念。

JS 在對象的原型中尋找繼承的屬性,也在原型的原型中尋找繼承的屬性,等等。

雖然最初的原型繼承看起來很笨拙,但是理解它之后,我們會喜歡它的簡單性和可能性。

作者:Dmitri Pavlutin 譯者:前端小智 來源:sitepoint

原文:https://dmitripavlutin.com/javascript-prototypal-inheritance/

本文轉載自微信公眾號「大遷世界」,可以通過以下二維碼關注。轉載本文請聯系大遷世界公眾號。

 

責任編輯:武曉燕 來源: 大遷世界
相關推薦

2011-08-31 14:48:33

JavaScript

2011-08-24 13:56:27

JavaScript

2013-09-18 14:01:46

JavaScript

2021-02-07 09:18:07

JavaScript 前端編程語言

2020-04-29 14:40:19

JavaScript繼承編程語言

2011-08-24 13:51:56

JavaScript

2010-10-08 09:13:15

oop模式JavaScript

2010-10-15 10:35:18

2021-03-15 14:00:56

PythonC語言編程語言

2020-02-20 14:00:15

JavaScript原型原型鏈

2016-12-27 09:10:29

JavaScript原型鏈繼承

2019-07-16 09:00:00

人工智能機器學習區塊鏈

2021-04-26 07:51:00

JavaScript方法函數

2019-10-16 08:25:33

JavaScriptwebprototype

2021-11-09 23:15:20

編程語言本質

2023-08-28 07:12:54

2021-02-07 23:07:00

PythonJavaScript語言

2017-04-07 11:15:49

原型鏈原型Javascript

2011-06-27 08:35:28

2018-05-15 10:34:50

JavaScript語言互聯網
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲在线免费观看 | 免费在线观看一区二区 | 国产精品一区二区欧美 | 亚洲精品在线观看视频 | 亚洲精品一区二区三区中文字幕 | 亚洲视频免费在线看 | 欧美一级在线 | 天天干视频 | 天天艹| 欧美精品综合在线 | 亚洲欧美精品在线观看 | 国产日韩欧美激情 | 国产乱码精品1区2区3区 | 一区二区三区精品在线视频 | 亚洲一区视频在线 | 国产欧美精品一区二区三区 | 成人久久网 | 操操网站 | 一区二区视频 | 99精品免费| 一级黄色淫片 | 在线视频日韩 | 蜜臀网 | 欧美日韩成人在线 | 人人看人人搞 | 天天综合网永久 | 九九久久久 | 91久久久久久久久久久 | 日韩欧美一级 | 国产精品成人一区二区 | 亚洲欧美日韩精品久久亚洲区 | 欧美精品在线一区二区三区 | 老司机午夜性大片 | 欧美中文字幕 | 在线免费小视频 | 91精品久久久久久久久久入口 | 国产免费一区二区三区 | 免费av电影网站 | 日韩一区在线播放 | 91国产在线播放 | 亚洲 欧美 日韩在线 |