摘要:如何繼承如上,只需簡單將函數的指向一個對象,就完成了對這個的對象的繼承。這一點和直接使用函數的繼承方式很像。中出現了類的語法糖,我們寫繼承就更簡便了。
原型
Each object has a private property which holds a link to another object called its prototype. That prototype object has a prototype of its own, and so on until an object is reached with null as its prototype. By definition, null has no prototype, and acts as the final link in this prototype chain. ---MDN
當我們在一個obj對象上查找是否具有某個屬性的時候,這個過程是這樣的:
1.現在obj 對象中查找是否有該屬性,如果有,查找終止。(也就是說如果obj對象上面和它的原型上又一個同名屬性,那么對象上面的屬性優先。)
2.如果沒有,則查看當前obj是否具有__proto__。這個__proto__就是obj原型的引用。如果obj對象沒有原型,那么查找終止。
3.如果obj有原型,就查找obj的原型上是否有這個屬性。如果有,查找終止。返回這個屬性。
4.如果obj的原型上沒有這個屬性,則查看obj的原型是否有原型。如果沒有,則查找終止。
5.如果obj的原型上上面有它自己的原型,那么繼續在obj的原型的原型上繼續查找。
幾乎每一個js對象都有原型,但是有個例外。
let a = Obeject.crate(null) let b = {}
當Object.create()傳入null的時候, 返回一個真正的空對象a。這個對象不同于b,a對象上什么都沒有,但是b對象上還有一個__proto__指向Object.prototype。
__proto__和prototypefunction Man(name){ this.name = name } Man.prototype.setName = function(name){ this.name = name } let a = new Man("lee") console.log(a)
輸出如下:
實例化的對象a中 有兩個屬性一個是name,還有一個就是它的原型__proto__。而這個__proto__是指向a 這個對象的構造函數 (a.__proto__.constructor 就是a這個對象的構造函數,也就是Man這個函數。) 的原型的。并且,修改對象的__proto__是不推薦的做法,對于性能的影響可能有時候我們不能不重視。而在Man的這個函數的prototype上面我們定義了一個setName的屬性。
所以按照上面的查找流程,我們在a對象的原型上找到了setName屬性。
let animal = { weight:20, setWeight:function(weight){ this.weight = weight } } function Cat(name){ this.name = name } cat.prototype = animal
如上,只需簡單將函數的prototype指向一個對象,就完成了對這個的對象的繼承?,F在所有通過new Cat()創建的對象都共享這個animal對象里面的屬性。
這一點和直接使用Object.create()函數的繼承方式很像。
另外一種繼承方式,也是比較受開發者認可,類似于下面這種:
function Animal(weight){ this.weight = weight } Animal.prototype.setWeight = function(weight){ this.weight = weight } function Cat(name,weight){ Animal.call(this,weight) this.name = name } //同時,我們別忘了,將Cat的prototype設為Animal的prototype,這樣就完成了對Animal的繼承。 Cat.prototype = Object.create(Animal.prototype) Cat.prototype.constructor = Cat
ES6 中出現了類的語法糖,我們寫繼承就更簡便了。
最后附上一張原型鏈的解析圖:
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/107378.html
摘要:時間年月日星期二說明本文部分內容均來自慕課網。慕課網教學源碼學習源碼第一章適配器模式的簡介簡介生活中的適配器翻譯軟件插座適配器適配器模式定義適配器模式講將一個類的接口,轉換成客戶期望的另外一個接口。 時間:2017年08月29日星期二說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:https://github.com/zccodere/s.....
摘要:李尋歡是風云第一刀書中第一高帥富。設計規范也將詳細規定何時何地使用何種控件,并提供詳細視覺設計稿,以便開發人員準確理解,避免歧義。而就在不久前,官宣停止對這個版本的維護,因此這個版本已經正式退出歷史舞臺。 Jerry: 我和周帥認識不久,自去年7月SAP成都研究院Cloud for Customer(以下簡稱為C4C)開發團隊組建至今,根據這段時間和周帥愉快的合作經歷,我覺得如果把周帥...
摘要:李尋歡是風云第一刀書中第一高帥富。設計規范也將詳細規定何時何地使用何種控件,并提供詳細視覺設計稿,以便開發人員準確理解,避免歧義。而就在不久前,官宣停止對這個版本的維護,因此這個版本已經正式退出歷史舞臺。 Jerry: 我和周帥認識不久,自去年7月SAP成都研究院Cloud for Customer(以下簡稱為C4C)開發團隊組建至今,根據這段時間和周帥愉快的合作經歷,我覺得如果把周帥...
閱讀 2878·2021-09-22 15:54
閱讀 1886·2019-08-30 15:53
閱讀 2239·2019-08-29 16:33
閱讀 1416·2019-08-29 12:29
閱讀 1387·2019-08-26 11:41
閱讀 2367·2019-08-26 11:34
閱讀 2947·2019-08-23 16:12
閱讀 1421·2019-08-23 15:56