摘要:首先為了模擬類(lèi)創(chuàng)建對(duì)象的功能搞出了構(gòu)造函數(shù)。也就是名字膚色膚色這里是繼承里的自有屬性生命值這里繼承的共有屬性的方法攻擊力兵種美國(guó)大兵攻擊防御死亡膚色
JS面向?qū)ο笾?【繼承】
我們已經(jīng)準(zhǔn)備了很多前置知識(shí),包括
原型鏈,對(duì)象和對(duì)象之間的關(guān)系
this,對(duì)象和函數(shù)之間的關(guān)系
new, 用函數(shù)批量創(chuàng)建特定的對(duì)象的語(yǔ)法糖
JS面向?qū)ο蟮那笆澜裆?/pre>我們說(shuō),面向?qū)ο笫且环N寫(xiě)代碼的套路。因?yàn)槿绻麧M足 封裝、繼承、多態(tài)就是面向?qū)ο蟮脑?那JS天生就有這3個(gè)特點(diǎn)。
那我們JS搞的這個(gè)面向?qū)ο笃鋵?shí)是模仿java的面向?qū)ο?因?yàn)榫W(wǎng)景公司在發(fā)明JavaScript時(shí),希望依托java讓自己的語(yǔ)言火起來(lái),
為此必須吸引java開(kāi)發(fā)者來(lái)使用,所以要模仿java搞出相當(dāng)于class的東西出來(lái)。好的,現(xiàn)在JS和Java已經(jīng)誕生了。但是Java中的繼承可以通過(guò)類(lèi)實(shí)現(xiàn),而JS中沒(méi)有類(lèi),JS里的繼承是通過(guò)原型鏈實(shí)現(xiàn)的。
至此,我們做的事情就是,讓java里用類(lèi)能做的事情,我們JS也必須想辦法搞出來(lái),而且盡可能的像java (就ES6里class的語(yǔ)法糖)
明確需求: 我們JS要實(shí)現(xiàn)的就是,java的類(lèi)能做的事情,我們也要能做。首先,JS為了模擬類(lèi)創(chuàng)建對(duì)象的功能,搞出了構(gòu)造函數(shù)。構(gòu)造函數(shù)就像class一樣可以,創(chuàng)建特定的對(duì)象,但是java程序員認(rèn)為你這構(gòu)造函數(shù),不是類(lèi)
因?yàn)閖ava的類(lèi)可以這樣寫(xiě),也就是子類(lèi)可以繼承父類(lèi)
class Human extend Animal但是JS最初沒(méi)有extend這樣的語(yǔ)法糖,來(lái)實(shí)現(xiàn)子構(gòu)造函數(shù)繼承父構(gòu)造函數(shù)
所以,JS沒(méi)法用extend關(guān)鍵字來(lái)直接繼承,于是苦思冥想出了其他方法來(lái)模擬子類(lèi)繼承父類(lèi)## 于是,我們學(xué)習(xí)JS是如何模擬子類(lèi)繼承父類(lèi)的
JS里沒(méi)有類(lèi),所以我們肯定看的是JS是如何讓子構(gòu)造函數(shù)繼承父構(gòu)造函數(shù)的
版本1: 讓Soldier繼承Humanfunction Human(options) { this.名字 = options.name, this.膚色 = options.膚色 } Human.prototype.eat = function () {} Human.prototype.drink = function () {} function Soldier(options) { Human.call(this,options) // 為了得到human里的自有屬性 this.生命值 = 42 this.ID = options.id } Soldier.prototype.__proto__ = Human.prototype // 為了得到human里的公有屬性 Soldier.prototype.攻擊力 = 5 Soldier.prototype.兵種 = "美國(guó)大兵" Soldier.prototype.攻擊 = function () {} Soldier.prototype.防御 = function () {} Soldier.prototype.死亡 = function () {} var soldier = new Soldier({name:"ziwei",膚色:"yellow",id:"8"}) console.log(soldier);這個(gè)方案是OK的,問(wèn)題在于__proto__不允許在生產(chǎn)環(huán)境使用,文檔明確有要求的,影響性能版本2 : 不用__proto__,讓Soldier繼承Human其實(shí)這個(gè)思路是很對(duì)的,JS肯定要用__proto__才能繼承。
現(xiàn)在的問(wèn)題就是,我要用__proto__,但是JS不讓我用。
所以JS開(kāi)發(fā)者就十分?jǐn)Q巴的用new來(lái)用__proto__,怎么用呢,看下面代碼:
Soldier.prototype.__proto__ = Human.prototype改成
function Fn(){} Fn.prototype = Human.prototype Soldier.prototype = new Fn()怎么解釋呢?
因?yàn)?Soldier.prototype是Fn構(gòu)造函數(shù)的實(shí)例,
所以 Soldier.prototype.__proto__ ==== Fn.prototype
而 Fn.prototype === Human.prototype
推論 Soldier.prototype.__proto__ === Human.prototype
完整的Soldier繼承Human
function Human(options) { this.名字 = options.name, this.膚色 = options.膚色 } Human.prototype.eat = function () {} Human.prototype.drink = function () {} function Soldier(options) { Human.call(this,options) // 這里是繼承Human里的自有屬性 this.生命值 = 42 this.ID = options.id } function Fn(){} Fn.prototype = Human.prototype Soldier.prototype = new Fn() // 成功繼承Human的共有屬性 ,私有屬性不要 Soldier.prototype.攻擊力 = 5 Soldier.prototype.兵種 = "美國(guó)大兵" Soldier.prototype.攻擊 = function () {} Soldier.prototype.防御 = function () {} Soldier.prototype.死亡 = function () {} var soldier = new Soldier({name:"ziwei",膚色:"yellow",id:"8"}) console.log(soldier);版本2.1: ES5提供Object.create()的語(yǔ)法糖,讓開(kāi)發(fā)者避免借助new,這種擰巴的方式來(lái)用__proto__介紹Object.create()接收一個(gè)參數(shù)obj1,return一個(gè)結(jié)果obj2
obj2會(huì)繼承obj1的屬性。也就是obj2.__proto__ = obj1
function Human(options) { this.名字 = options.name, this.膚色 = options.膚色 } Human.prototype.eat = function () {} Human.prototype.drink = function () {} function Soldier(options) { Human.call(this,options) // 這里是繼承Human里的自有屬性 this.生命值 = 42 this.ID = options.id } Soldier.prototype = Object.create(Human.prototype) // 這里繼承 Human 的共有屬性,ES5的方法 Soldier.prototype.攻擊力 = 5 Soldier.prototype.兵種 = "美國(guó)大兵" Soldier.prototype.攻擊 = function () {} Soldier.prototype.防御 = function () {} Soldier.prototype.死亡 = function () {} var soldier = new Soldier({name:"ziwei",膚色:"yellow",id:"8"}) console.log(soldier);
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/110104.html
摘要:可以與任何支持與服務(wù)器進(jìn)行通訊。首先,我們使用用語(yǔ)言創(chuàng)建一個(gè)服務(wù)器。一創(chuàng)建服務(wù)器步驟創(chuàng)建一個(gè)空的項(xiàng)目,取名為,名字可以按照情況而取。中,處理異步代碼通常有種方式回調(diào)承諾可觀察對(duì)象使用命令行組件名實(shí)例組件名為。運(yùn)行時(shí)發(fā)生錯(cuò)誤,提示改為則正常。 Angular可以與任何支持http與websocket服務(wù)器進(jìn)行通訊。 首先,我們使用node.js用typescript語(yǔ)言創(chuàng)建一個(gè)web服務(wù)...
摘要:下文稱位置屬性即為。注意,不會(huì)脫離文檔流,具體見(jiàn)下面的圖示。直譯為修正,簡(jiǎn)單粗暴,直接相對(duì)瀏覽器窗口顯示區(qū)域定位。 Position定位 個(gè)人覺(jué)得position這個(gè)屬性真的算是CSS的見(jiàn)面殺了。尤其是absolute,當(dāng)年可是被虐的不輕。當(dāng)然了,現(xiàn)在愛(ài)上了這個(gè)屬性,誰(shuí)用誰(shuí)知道。 position屬性 position是CSS的一個(gè)屬性,地位較高,也是我們重點(diǎn)要說(shuō)的一個(gè)屬性。 對(duì)應(yīng)了四...
摘要:下文稱位置屬性即為。注意,不會(huì)脫離文檔流,具體見(jiàn)下面的圖示。直譯為修正,簡(jiǎn)單粗暴,直接相對(duì)瀏覽器窗口顯示區(qū)域定位。 Position定位 個(gè)人覺(jué)得position這個(gè)屬性真的算是CSS的見(jiàn)面殺了。尤其是absolute,當(dāng)年可是被虐的不輕。當(dāng)然了,現(xiàn)在愛(ài)上了這個(gè)屬性,誰(shuí)用誰(shuí)知道。 position屬性 position是CSS的一個(gè)屬性,地位較高,也是我們重點(diǎn)要說(shuō)的一個(gè)屬性。 對(duì)應(yīng)了四...
摘要:之五關(guān)于字符串以及數(shù)組的操作關(guān)于數(shù)組的操作先掌握一些基本的數(shù)組操作用于拼接多個(gè)數(shù)組,接受多個(gè)參數(shù)從數(shù)組尾部插入一個(gè)數(shù),并返回新的數(shù)組長(zhǎng)度從數(shù)組尾部刪除一個(gè)數(shù),并返回被刪除的數(shù)從數(shù)組頭部刪除一個(gè)數(shù),并返回被刪除的數(shù)從數(shù)組頭部插入一個(gè)數(shù),并返回 之五:關(guān)于字符串以及數(shù)組的操作 關(guān)于數(shù)組的操作 先掌握一些基本的數(shù)組操作 concat // 用于拼接多個(gè)數(shù)組,接受多個(gè)參數(shù) push /...
閱讀 2959·2021-11-25 09:43
閱讀 3336·2021-11-24 09:39
閱讀 2844·2021-09-22 15:59
閱讀 2214·2021-09-13 10:24
閱讀 520·2019-08-29 17:02
閱讀 2111·2019-08-29 13:23
閱讀 3071·2019-08-29 13:06
閱讀 3550·2019-08-29 13:04