精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如果使用 JavaScript 原型實現繼承

開發 前端
在這篇文章中,我們將討論原型以及如何在 JS 中使用它們進行繼承。我們還將會看到原型方法與基于類的繼承有何不同。

在這篇文章中,我們將討論原型以及如何在 JS 中使用它們進行繼承。我們還將會看到原型方法與基于類的繼承有何不同。

[[324380]]

繼承

繼承是編程語言的一個顯著特征,隨著面向對象編程語言的引入而出現。這些語言大多是基于類的語言。在這里,類就像一個藍圖,對象是它的展現形式。就是說,要創建一個對象,首先我們必須創建一個類,然后我們可以從一個類創建任意數量的對象。

想象一下,我們有一個表示智能手機的類。這個類具有像其他智能手機一樣的可以拍照、有GPS定位等功能。下面是使用 c++ 來描述這樣的一個類:

  1. class SmartPhone { 
  2.   public: 
  3.   void captureImages() {} 
  4.  
  5. SmartPhone x; 
  6. x.captureImages() 

我們創建了一個名為SmartPhone的類,它有一個名為capturePictures的方法用來拍照。

如果我們需要一個iPhone類,它可以捕捉圖像和一些特殊的功能,比如面部ID掃描。下面是兩種可能的解決方案:

  • 將捕獲圖像功能與其他常見的智能手機功能,以及iPhone的特定功能一起重寫到一個新類中。但是這種方法需要更多的時間和精力,并且會引入更多的bug。
  • 重用SmartPhone類中的功能,這就是繼承的作用,繼承也是重用其他類/對象中功能的一種方式。

這里是我們如何從SmartPhone類中繼承capturePictures方法,使用 c++ 實現如下:

  1. class Iphone: public SmartPhone { 
  2.   public: 
  3.   void faceIDScan() {} 
  4.  
  5. Iphone x 
  6.  
  7. x.faceIDScan() 
  8.  
  9. x.captureImages() 

上面是一個簡單的繼承示例。但是,它表明繼承可以使我們以某種方式重用代碼,從而使所生成的程序更不易出錯,并且花費更少的時間進行開發。

以下是關于類的一些重要信息:

  • 繼承該功能的類稱為子類
  • 被繼承的類稱為父類
  • 一個類可以同時從多個類中繼承
  • 我們可以具有多個繼承級別。例如,類C繼承自類B,而類B繼承自類A

值得注意的是,類本身并沒有做任何事情。在從類創建對象之前,實際上沒有完成任何工作。我們將看到它為什么不同于JavaScript。

原型是什么?

在 JS 中,所有對象都有一個特殊的內部屬性,該屬性基本上是對另一個對象的引用。此引用取決于對象的創建方式。在 ECMAScript/JavaScript規范中,它表示為[[Prototype]]。

由于[[Prototype]]鏈接到一個對象,所以該對象有自己的[[Prototype]]引用。這就是建立原型鏈的方式。

這個[[Prototype]]鏈是 JS 中繼承的構建塊。

__proto__ 對象

為了訪問對象的[[Prototype]],大多數瀏覽器都提供__proto__屬性。訪問方式如下:

  1. obj.__proto__ 

需要注意的是,這個屬性不是 ECMAScript 標準的一部分,它實際上是由瀏覽器實現的。

獲取和設置原型方法

除了__proto__屬性外,還有一種訪問[[Prototype]]的標準方法:

  1. Object.getPrototypeOf(obj); 

對應的有個類似的方法來設置對象的[[Prototype]]:

  1. Object.setPrototypeOf(obj, prototype); 

`[[Prototype]]`和`.prototype`屬性

[[Prototype]] 只不過是一種用來表示物體原型的標準符號。許多開發人員將其與.prototype屬性混淆,這是完全不同的事情,接著我們來研究一下.prototype屬性。

在 JS 中,有許多創建對象的方法。一種方法是使用構造函數,像這樣使用new關鍵字來調用它:

  1. function SmartPhone(os) { 
  2.   this.os = os 
  3.  
  4. let phone = new SmartPhone('Android') 

在控制臺打印 phone 對象:

  1.   os: "IPhone" 
  2.   __proto__{ 
  3.     constructor: ƒ SmartPhone(os) 
  4.    __proto__: Object 
  5.   } 

現在,如果我們希望在phone對象上有一些方法,我們可以在函數上使用.prototype屬性,如下所示:

  1. SmartPhone.prototype.isAndroid = function () { 
  2.   return this.os === 'Android' || 'android' 

再次創建phone對象時,打印 phone 對象如下:

  1.   os: "Android" 
  2.   __proto__{ 
  3.     isAndroid: ƒ() 
  4.     constructor: ƒ SmartPhone(os) 
  5.    __proto__: Object 
  6.   } 

我們可以在對象的[[Prototype]]中看到isAndroid()方法。

簡而言之,.prototype屬性基本上就像由給定的構造函數創建的[[Prototype]]對象的藍圖。在.prototype屬性/對象中聲明的所有內容都會在對象的[[Prototype]]中彈出。

實上,如果將 SmartPhone.prototype 與phone 的[[Prototype]]進行比較,就會發現它們是相同的:

  1. console.log(Object.getPrototypeOf(phone) === SmartPhone.prototype); 
  2. // true 

值得注意的是,我們還可以在構造函數中創建方法:

  1. function ObjectA() { 
  2.   this.methodA = function () {} 
  3.  
  4. let firstObj = new ObjectA() 
  5. console.log(firstObj) 

這種方法的問題是當我們初始化一個新對象時。所有實例都有自己methodA的副本。相反,當我們在函數的原型上創建它時,對象的所有實例只共享方法的一個副本,顯然使用原型的方式效率會過高。

當我們訪問屬性時這里發生了什么?

當我們訪問一個屬性以獲取它時,會發生以下情況:

JS 引擎查找對象上的屬性,如果找到了該屬性,然后返回它。否則,JS 引擎將通過查看[[Prototype]]來檢查對象的繼承屬性,如果找到該屬性,則返回它,否則,它會查找 [[Prototype]]的[[Prototype]]。找到屬性或沒有[[Prototype]]時,該鏈結束,這意味著我們已經到達原型鏈的末端。

當我們設置/創建屬性時,JS 總是在對象本身上進行設置。即使[[Prototype]]鏈上存在相同的屬性,下面是一個例子:

  1. function MyObject() {} 
  2. MyObject.prototype.propA = 10; // 在原型上創建屬性 
  3.  
  4. let myObject = new MyObject(); 
  5. console.log(myObject.propA); // [[Prototype]]上的屬性 
  6. // 10 
  7.  
  8. myObject.propA = 20; // 對象的屬性 
  9. console.log(myObject.propA); 
  10. // 20 

在上面的示例中,我們創建了一個構造函數,該函數的[[Prototype]]上具有屬性propA。當我們嘗試對其進行讀取操作時,會在控制臺中看到該值。但是,當我們嘗試在對象本身上設置相同的屬性時;JS 使用給定值在對象上創建一個新屬性?,F在,如果我們不能直接訪問[[Prototype]]上的屬性。

值得注意的是,普通對象的[[Prototype]]鏈的末尾是內置的Object.prototype。這就是為什么大多數對象共享許多方法(例如toString())的原因。因為它們實際上是在Object.prototype上定義的。

使用原型繼承的各種方法

在 JS 中,無論我們如何創建對象,只有原型繼承,但這些方式還有一些區別,來看看:

對象字面量:

在JavaScript中創建對象的最簡單方法是使用對象字面量:

  1. let obj = {} 

如果在瀏覽器的控制臺中打印obj,我們將看到以下內容:

基本上,所有用文字面量創建的對象都繼承了Object.prototype的屬性。

需要注意的是__proto__對象引用了創建它的構造函數。在這種情況下,constructor屬性指向Object構造函數。

使用對象構造函數

另一種不太常見的創建對象的方法是使用對象構造函數。JS 提供了一個名為Object的內置構造函數方法來創建對象。

  1. let obj = new Object(); 

這種方法的結果與對象字面量的方式相同。它從Object.prototype繼承屬性。因為我們使用Object作為構造函數。

(1) Object.create 方法

使用此輔助方法,我們可以創建一個帶有[[Prototype]]的對象,如下所示:

  1. let SmartPhone = { 
  2.   captureImages: function() {} 
  3.  
  4. let Iphone = Object.create(SmartPhone) 
  5.  
  6. Iphone.captureImages() 

這是在 JS 中使用繼承的最簡單方法之一。猜猜我們如何在沒有任何[[Prototype]]引用的情況下創建對象?

(2) 構造方法

與 JS 運行時提供的對象構造函數相似。我們還可以創建自己的構造函數,以創建適合我們需求的對象,如下所示:

  1. function SmartPhone(os) { 
  2.   this.os = os; 
  3.  
  4. SmartPhone.prototype.isAndroid = function() { 
  5.   return this.os === 'Android'; 
  6. }; 
  7.  
  8. SmartPhone.prototype.isIOS = function() { 
  9.   return this.os === 'iOS'; 
  10. }; 

現在,我們想創建一個iPhone類,它應該有'iOS'作為它 os 屬性的值。它還應該有faceIDScan方法。

首先,我們必須創建一個Iphone構造函數,在其中,我們應該調用SmartPhone構造函數,如下所示:

  1. function Iphone() { 
  2.    SmartPhone.call(this, 'iOS'); 

這會將Iphone構造函數中的this.os屬性設置為’iOS‘。

之所以調用SmartPhone.call方法,是因為我們需要更改 this 值以引用Iphone。這類似于在面向對象的世界中調用父級的構造函數。

接下來的事情是,我們必須從SmartPhone構造函數繼承方法。我們可以在此處使用Object.create朋友,如下所示:

  1. Iphone.prototype = Object.create(SmartPhone.prototype); 

現在,我們可以使用.prototype為Iphone添加方法,如下所示:

  1. Iphone.prototype.faceIDScan = function() {}; 

最后,我們可以使用Iphone創建一個對象,如下所示:

  1. let x = new Iphone(); 
  2.  
  3. // calling inherited method 
  4. console.log(x.isIOS()): 
  5. // true 

(3) ES6 class

使用ES6,整個過程非常簡單。我們可以創建類(它們與C ++或其他任何基于類的語言中的類不同,只是在原型繼承之上的語法糖),然后從其他類派生新的類。

下面是我們如何在ES6中創建類:

  1. class SmartPhone { 
  2.   constructor(os) { 
  3.     this.os = os; 
  4.   } 
  5.   isAndroid() { 
  6.     return this.os === 'Android'; 
  7.   } 
  8.   isIos() { 
  9.     return this.os === 'iOS'; 
  10.   } 
  11. }; 

現在,我們可以創建一個派生自SmartPhone的新類,如下所示:

  1. class Iphone extends SmartPhone { 
  2.    constructor() { 
  3.      super.call('iOS'); 
  4.    } 
  5.    faceIDScan() {} 

我們不是調用SmartPhone.call,而是調用super.call。在內部,JavaScript引擎會自動為我們執行此操作。

最后,我們可以使用Iphone創建一個對象,如下所示:

  1. let x = new Iphone(); 
  2.  
  3. x.faceIDScan(); 
  4.  
  5. // calling inherited method 
  6. console.log(x.isIos()): 
  7. // true 

該ES6示例與先前的構造方法示例相同。但是閱讀和理解起來要干凈得多。

 

責任編輯:趙寧寧 來源: 大遷世界
相關推薦

2011-08-31 14:48:33

JavaScript

2011-08-24 13:56:27

JavaScript

2013-09-18 14:01:46

JavaScript

2011-08-24 13:51:56

JavaScript

2010-10-08 09:13:15

oop模式JavaScript

2016-12-27 09:10:29

JavaScript原型鏈繼承

2020-11-30 07:59:59

JavaScript語言原型

2024-09-14 15:07:03

2020-02-20 14:00:15

JavaScript原型原型鏈

2023-08-28 07:12:54

2017-04-07 11:15:49

原型鏈原型Javascript

2022-03-29 09:15:55

Javascript函數屬性

2022-04-14 20:43:24

JavaScript原型鏈

2022-05-26 09:20:01

JavaScript原型原型鏈

2020-10-20 08:35:34

JS基礎進階

2012-02-14 09:45:02

JavaScript

2016-06-07 14:28:39

Javascript原型

2022-06-20 09:22:55

js原型鏈前端

2012-11-08 10:40:47

JavaScript原型鏈

2015-11-04 09:57:18

JavaScript原型
點贊
收藏

51CTO技術棧公眾號

欧美日韩中文字幕综合视频| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲国产黄色片| 国产免费黄色小视频| 天天干天天舔天天射| 亚洲一区二区网站| 色av吧综合网| 国产无套精品一区二区三区| 天堂中文在线播放| 亚洲国产精品激情在线观看| 91久久精品国产91久久性色| 久久视频免费看| 视频一区在线观看| 日韩欧美一级在线播放| 99精品视频在线看| caopeng在线| 91亚洲精品久久久蜜桃网站| 国产女精品视频网站免费| 九九热这里有精品视频| 国产精品亚洲二区| 精品裸体舞一区二区三区| 成人亚洲视频在线观看| 日韩免费影院| 欧美国产欧美综合| 国产在线一区二区三区四区| 在线观看国产精品入口男同| 国产一区91| 欧美成aaa人片免费看| 老牛影视av老牛影视av| 亚洲不卡在线| 欧美日韩视频不卡| 日本福利视频在线| 18网站在线观看| 欧美高清在线一区| 久久亚洲一区二区| 性生交大片免费看女人按摩| 欧美aaaaaa午夜精品| 97久久精品国产| 玖玖爱这里只有精品| 欧美一区二区三区激情视频| 亚洲精品videossex少妇| 久久久久久久久久毛片| 欧美日韩精品一区二区三区视频| 亚洲成人午夜影院| 青草全福视在线| av在线之家电影网站| 91看片淫黄大片一级| 国产v亚洲v天堂无码| 97精品久久人人爽人人爽| 宅男噜噜噜66国产日韩在线观看| 欧美肥老妇视频| 亚洲波多野结衣| 久久影院100000精品| 国产香蕉一区二区三区在线视频 | 中文字幕在线直播| 亚洲h动漫在线| 日韩精品综合在线| 欧美人体视频xxxxx| 亚洲乱码国产乱码精品精的特点| 亚洲最大色综合成人av| 日韩av中文| 国产精品激情偷乱一区二区∴| 日本一区二区免费看| 噜噜噜在线观看播放视频| 久久影院电视剧免费观看| 久久本道综合色狠狠五月| 天堂在线观看视频| 91丨九色丨蝌蚪富婆spa| 久久久99国产精品免费| 四虎精品在线| 久久久精品黄色| 日本一区二区免费看| a黄色在线观看| 国产精品免费看片| 米仓穗香在线观看| 欧美hdxxx| 亚洲一区免费观看| 99视频在线免费播放| 色在线中文字幕| 色综合激情久久| 一级在线免费视频| 91亚洲精品在看在线观看高清| 3d动漫精品啪啪1区2区免费| 亚洲视频在线不卡| 麻豆精品av| 伊人伊人伊人久久| 精品国产欧美日韩不卡在线观看| 99精品综合| www.亚洲人.com| 黄色在线观看免费| 久久精品成人| 91精品综合视频| 狠狠综合久久av一区二区| 99精品视频一区| 视频一区二区在线| av在线免费网站| 天天操天天色综合| 国产区二区三区| 日本一区精品视频| 亚洲欧美日韩网| 久久久久久久久久网站| 国产精品入口| 91精品视频播放| 五月天婷婷激情网| 国产精品国产三级国产aⅴ入口 | 国产三级三级看三级| 久久精品九色| 亚洲欧美日韩综合| wwwav国产| 久久久久久久欧美精品| 亚洲一区中文字幕在线观看| 亚州av在线播放| 中文字幕一区二区三区蜜月| 国产男女免费视频| 视频91a欧美| 日韩美女av在线| 永久av免费网站| 性欧美精品高清| 999国产在线| av在线播放av| 欧美午夜xxx| 91性高潮久久久久久久| 国产一区二区三区站长工具| 欧美—级高清免费播放| 91av国产精品| 国产欧美日韩麻豆91| 黄色大片在线免费看| 国产精品视频一区二区三区综合 | 中国一级特黄录像播放| 夜间精品视频| 国产精品视频在线观看| 天天干天天爽天天操| 一区二区不卡在线播放| 五月天av在线播放| 国产videos久久| 国模极品一区二区三区| 亚洲国产精品成人久久蜜臀| 国产精品的网站| 日韩一级片播放| 欧美aaaaaaaa牛牛影院| 久久久久久久一| 99在线小视频| 成人欧美一区二区三区视频网页| 蜜臀久久99精品久久久酒店新书| 激情av综合| 久久久亚洲国产天美传媒修理工| 国产美女免费看| 中文字幕在线观看一区| 亚洲污视频在线观看| 国产精品亚洲人成在99www| 2024亚洲男人天堂| 污污网站免费在线观看| 五月综合激情日本mⅴ| 国产精久久久久| 午夜久久一区| 999热视频在线观看| 亚洲h片在线看| 日韩一区二区三区免费看| 黄视频网站免费看| 韩国一区二区三区| 18视频在线观看娇喘| 国产精品**亚洲精品| 久久国产精品久久久久| 国产高清免费在线观看| 亚洲一区二区在线免费观看视频| 国产人妻精品久久久久野外| 欧美成人高清| 91入口在线观看| 黄色成人在线网| 亚洲黄色www| 欧美激情黑白配| 国产亚洲综合性久久久影院| 国产精品视频黄色| 欧美高清视频手机在在线| 成人黄色午夜影院| 久草在线新免费首页资源站| 精品国产乱码久久久久久久久| 国产在线视频第一页| 99在线热播精品免费| 黄在线观看网站| 波多野结衣一区| 91视频免费在线| 成年人视频免费在线播放| 日韩av在线最新| 91黑人精品一区二区三区| 国产精品久久免费看| 伊人免费视频二| 亚洲国产日韩欧美一区二区三区| 麻豆成人在线播放| 欧美一区二区三区婷婷| 欧美疯狂性受xxxxx另类| 青青草观看免费视频在线| 欧美精品xxxxbbbb| 日本视频www| 欧美国产日韩亚洲一区| 俄罗斯女人裸体性做爰| 另类亚洲自拍| 强伦女教师2:伦理在线观看| 国产精品丝袜在线播放| 国产精品吊钟奶在线| 影音先锋男人资源在线| 精品一区二区三区四区在线| 一级二级三级视频| 午夜国产精品一区| 可以免费看av的网址| 99视频超级精品| 爱爱爱爱免费视频| 国产农村妇女精品一区二区| 992tv成人免费观看| 香蕉视频一区二区三区| 91视频九色网站| 国精产品一区一区三区四川| 久久免费视频这里只有精品| 91视频在线观看| 日韩av在线看| 国产成人精品一区二区无码呦| 色婷婷综合久久久久中文一区二区| 欧美国产日韩在线观看成人| 欧美激情一区二区在线| 影音先锋黄色资源| 国产剧情一区在线| 欧美日韩怡红院| 中文字幕一区二区三区四区五区| 日日狠狠久久偷偷综合色| **亚洲第一综合导航网站| 国产精品4hu.www| 青青草国产精品一区二区| 好吊日av在线| 久久综合伊人77777蜜臀| 国产黄色片在线播放| 日韩大片免费观看视频播放| 99热这里只有精品5| 欧美三电影在线| 99精品人妻国产毛片| 亚洲地区一二三色| 欧美成人三级视频| 日韩一区欧美小说| 激情五月激情综合| 欧美国产在线观看| 国产sm调教视频| 久久一留热品黄| 182在线视频| 丰满亚洲少妇av| 最好看的中文字幕| 国产伦精品一区二区三区视频青涩 | 欧美日韩中文在线| 国产亚洲欧美精品久久久www| 国产精品乱码一区二区三区软件| 无码h肉动漫在线观看| 久久夜色精品国产欧美乱极品| 久久久老熟女一区二区三区91| 国产成人在线观看| 99久久综合网| 国产成人99久久亚洲综合精品| www.日本久久| 国产精品白丝av| 永久av免费在线观看| 国产精品原创巨作av| 五月天婷婷在线观看视频| 国产一区二区三区美女| 国产精品中文久久久久久| 国产麻豆精品视频| 中国男女全黄大片| youjizz久久| 国产制服丝袜在线| 久久久久久久久伊人| 久久视频精品在线观看| 国产精品久久毛片| 久草综合在线视频| 亚洲h精品动漫在线观看| 黄色大片网站在线观看| 色老汉一区二区三区| 一区二区小视频| 欧美一区二区成人6969| 高清乱码毛片入口| 日韩成人xxxx| 国产一级二级三级在线观看| 中文字幕在线日韩| 26uuu亚洲电影在线观看| 国语自产精品视频在线看一大j8| 日本不卡1234视频| 国产精品老女人精品视频| 国产精品一级在线观看| 国产精品日韩欧美一区二区| 亚洲理论电影| 亚洲最新免费视频| 亚洲片区在线| 久久综合伊人77777麻豆最新章节| 老鸭窝一区二区久久精品| 亚洲妇女无套内射精| 久久这里只精品最新地址| 日韩欧美黄色网址| 一区二区成人在线| 天天综合久久综合| 日韩天堂在线观看| 日韩三级电影网| 久久精品人人爽| 国产理论在线| 成人网页在线免费观看| 久久91在线| 亚洲精品视频一二三| 国产在线成人| 欧美性猛交久久久乱大交小说| 国产一区二区伦理| 国产精品密蕾丝袜| 一区二区三区日韩| 久久久久久久久久一级| 精品欧美乱码久久久久久| av小片在线| 国内精品久久久久| 高清不卡一区| 日韩欧美第二区在线观看| 黑人一区二区三区四区五区| 在线免费视频a| 99热在这里有精品免费| 三级影片在线看| 欧美性猛片xxxx免费看久爱| 内射无码专区久久亚洲| 精品国产欧美一区二区五十路 | 精品人妻一区二区三区四区不卡 | 97人人精品| 国产91美女视频| 国产九九视频一区二区三区| 在线国产视频一区| 午夜久久久影院| 精品国产伦一区二区三| 永久555www成人免费| 亚洲精品88| 国产精品yjizz| 99精品全国免费观看视频软件| 成人免费观看视频在线观看| 成人永久免费视频| 日韩在线观看视频一区二区| 欧美日韩一区二区欧美激情| 色猫av在线| 久久久久久久久电影| 久久丁香四色| 91xxx视频| 久久se精品一区二区| av电影网站在线观看| 色综合久久99| 亚洲av成人精品毛片| 久久久久久久久网站| 2020最新国产精品| 成人高清dvd| 国产专区综合网| sm捆绑调教视频| 欧美日本不卡视频| 啊v视频在线| 国产精品扒开腿做爽爽爽的视频| 婷婷精品在线观看| 鲁一鲁一鲁一鲁一澡| 97成人超碰视| 欧美videossex极品| 国产丝袜一区二区三区免费视频| 国产美女高潮在线观看| 精品乱色一区二区中文字幕| 91久久亚洲| 国产白嫩美女无套久久| 欧美午夜性色大片在线观看| 日韩精品系列| 日韩美女视频在线观看| 国产伦精品一区二区三区视频 | 国产综合色视频| 精品国产视频一区二区三区| 51久久夜色精品国产麻豆| 天堂av最新在线| 国产日韩欧美一区二区三区四区| 99成人在线| 国产精久久一区二区三区| 欧美午夜一区二区| 二区三区在线观看| 99久re热视频这里只有精品6| 国内成人在线| 2一3sex性hd| 91福利视频在线| 午夜免费福利在线观看| 亚洲永久免费观看| 99精品久久| 久久久久无码精品国产sm果冻 | 毛葺葺老太做受视频| 国产精品家庭影院| 丰满少妇在线观看bd| 青青草99啪国产免费| 99精品视频在线| 黄色在线免费播放| 欧美在线视频不卡| 久草中文在线观看| 好看的日韩精品| 蜜臀国产一区二区三区在线播放| 日韩a级片在线观看| 日韩精品视频观看| **国产精品| 免费看一级大黄情大片| 中文字幕一区免费在线观看| 欧美视频久久久| 国产精品亚洲综合天堂夜夜| 国产一在线精品一区在线观看| 国产sm调教视频| 欧美v国产在线一区二区三区|