摘要:如何繼承如上,只需簡單將函數(shù)的指向一個對象,就完成了對這個的對象的繼承。這一點和直接使用函數(shù)的繼承方式很像。中出現(xiàn)了類的語法糖,我們寫繼承就更簡便了。
原型
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
當(dāng)我們在一個obj對象上查找是否具有某個屬性的時候,這個過程是這樣的:
1.現(xiàn)在obj 對象中查找是否有該屬性,如果有,查找終止。(也就是說如果obj對象上面和它的原型上又一個同名屬性,那么對象上面的屬性優(yōu)先。)
2.如果沒有,則查看當(dāng)前obj是否具有__proto__。這個__proto__就是obj原型的引用。如果obj對象沒有原型,那么查找終止。
3.如果obj有原型,就查找obj的原型上是否有這個屬性。如果有,查找終止。返回這個屬性。
4.如果obj的原型上沒有這個屬性,則查看obj的原型是否有原型。如果沒有,則查找終止。
5.如果obj的原型上上面有它自己的原型,那么繼續(xù)在obj的原型的原型上繼續(xù)查找。
幾乎每一個js對象都有原型,但是有個例外。
let a = Obeject.crate(null) let b = {}
當(dāng)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 這個對象的構(gòu)造函數(shù) (a.__proto__.constructor 就是a這個對象的構(gòu)造函數(shù),也就是Man這個函數(shù)。) 的原型的。并且,修改對象的__proto__是不推薦的做法,對于性能的影響可能有時候我們不能不重視。而在Man的這個函數(shù)的prototype上面我們定義了一個setName的屬性。
所以按照上面的查找流程,我們在a對象的原型上找到了setName屬性。
let animal = { weight:20, setWeight:function(weight){ this.weight = weight } } function Cat(name){ this.name = name } cat.prototype = animal
如上,只需簡單將函數(shù)的prototype指向一個對象,就完成了對這個的對象的繼承。現(xiàn)在所有通過new Cat()創(chuàng)建的對象都共享這個animal對象里面的屬性。
這一點和直接使用Object.create()函數(shù)的繼承方式很像。
另外一種繼承方式,也是比較受開發(fā)者認(rèn)可,類似于下面這種:
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設(shè)為Animal的prototype,這樣就完成了對Animal的繼承。 Cat.prototype = Object.create(Animal.prototype) Cat.prototype.constructor = Cat
ES6 中出現(xiàn)了類的語法糖,我們寫繼承就更簡便了。
最后附上一張原型鏈的解析圖:
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/107378.html
摘要:這是實現(xiàn)繼承的最通用的方式,這種方法的缺點實例化子類的時候父級的構(gòu)造函數(shù)執(zhí)行了次,沒有必要執(zhí)行次。 原型鏈類 創(chuàng)建對象有幾種方法 1、字面量對象var o1 = {name:1}var o11 = new Object({name:11})2、顯示構(gòu)造函數(shù)創(chuàng)建var M = function(){this.name =o2}var o2 = new M();3.Object.creat...
摘要:時間年月日星期二說明本文部分內(nèi)容均來自慕課網(wǎng)。慕課網(wǎng)教學(xué)源碼學(xué)習(xí)源碼第一章適配器模式的簡介簡介生活中的適配器翻譯軟件插座適配器適配器模式定義適配器模式講將一個類的接口,轉(zhuǎn)換成客戶期望的另外一個接口。 時間:2017年08月29日星期二說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:https://github.com/zccodere/s.....
摘要:李尋歡是風(fēng)云第一刀書中第一高帥富。設(shè)計規(guī)范也將詳細(xì)規(guī)定何時何地使用何種控件,并提供詳細(xì)視覺設(shè)計稿,以便開發(fā)人員準(zhǔn)確理解,避免歧義。而就在不久前,官宣停止對這個版本的維護,因此這個版本已經(jīng)正式退出歷史舞臺。 Jerry: 我和周帥認(rèn)識不久,自去年7月SAP成都研究院Cloud for Customer(以下簡稱為C4C)開發(fā)團隊組建至今,根據(jù)這段時間和周帥愉快的合作經(jīng)歷,我覺得如果把周帥...
摘要:李尋歡是風(fēng)云第一刀書中第一高帥富。設(shè)計規(guī)范也將詳細(xì)規(guī)定何時何地使用何種控件,并提供詳細(xì)視覺設(shè)計稿,以便開發(fā)人員準(zhǔn)確理解,避免歧義。而就在不久前,官宣停止對這個版本的維護,因此這個版本已經(jīng)正式退出歷史舞臺。 Jerry: 我和周帥認(rèn)識不久,自去年7月SAP成都研究院Cloud for Customer(以下簡稱為C4C)開發(fā)團隊組建至今,根據(jù)這段時間和周帥愉快的合作經(jīng)歷,我覺得如果把周帥...
閱讀 2899·2021-09-22 15:54
閱讀 1897·2019-08-30 15:53
閱讀 2247·2019-08-29 16:33
閱讀 1425·2019-08-29 12:29
閱讀 1396·2019-08-26 11:41
閱讀 2375·2019-08-26 11:34
閱讀 2962·2019-08-23 16:12
閱讀 1428·2019-08-23 15:56