摘要:每一個(gè)通過(guò)構(gòu)造函數(shù)實(shí)例化的對(duì)象和都具有構(gòu)造函數(shù)中的屬性,實(shí)例和構(gòu)造函數(shù)之間是構(gòu)造關(guān)系構(gòu)造過(guò)程中也形成了原型關(guān)系是的原型,是的原型,實(shí)例通過(guò)原型鏈找到原型中的屬性和方法。自定義和構(gòu)造函數(shù)的屬性是自有屬性,它們是對(duì)象本身的屬性。
繼承原理:實(shí)例中包含一個(gè)指向原型對(duì)象的內(nèi)部指針
實(shí)現(xiàn)方法:讓原型對(duì)象等于另一個(gè)類型的實(shí)例
關(guān)鍵點(diǎn):
構(gòu)造函數(shù)、原型對(duì)象、實(shí)例
實(shí)例屬性、原型方法
構(gòu)造關(guān)系、原型關(guān)系
自有屬性、繼承屬性和方法
demo:
//構(gòu)造器 function Animal() { this.animal = "animal"; }; function Mammal() { this.mammal = "mammal"; }; var cat; //原型鏈 Mammal.prototype = new Animal(); cat = new Mammal(); //添加屬性和方法 Animal.prototype.isAnimal = true; Animal.prototype.sayAnimal = function() { alert("Is it " + this.animal + "? " + this.isAnimal); }; Mammal.prototype.isMammal = true; Mammal.prototype.sayMammal = function() { alert("Is it a " + this.mammal + "? " + this.isMammal); };
先來(lái)看看每個(gè)對(duì)象都能訪問(wèn)到哪些屬性和方法:
Animal.prototype:
isAnimal //自定義 sayAnimal() //自定義
Mammal.prototype:
isMammal //自定義 sayMammal() //自定義 animal //來(lái)自構(gòu)造函數(shù) isAnimal //來(lái)自繼承 sayAnimal() //來(lái)自繼承
cat:
mammal //來(lái)自構(gòu)造函數(shù) isMammal //來(lái)自繼承 sayMammal() //來(lái)自繼承 animal //來(lái)自繼承 isAnimal //來(lái)自繼承 sayAnimal() //來(lái)自繼承
在這個(gè)demo中,有兩對(duì)構(gòu)造關(guān)系和兩對(duì)繼承關(guān)系(不考慮Object)。每一個(gè)通過(guò)構(gòu)造函數(shù)實(shí)例化的對(duì)象(Mammal.prototype和cat)都具有構(gòu)造函數(shù)中的屬性,實(shí)例和構(gòu)造函數(shù)之間是構(gòu)造關(guān)系;構(gòu)造過(guò)程中也形成了原型關(guān)系:Mammal.prototype是cat的原型,Animal.prototype是Mammal.prototype的原型,實(shí)例通過(guò)原型鏈找到原型中的屬性和方法。
自定義和構(gòu)造函數(shù)的屬性是自有屬性,它們是對(duì)象本身的屬性。來(lái)自繼承的屬性和方法是對(duì)象沿著原型鏈找到的,它們并不是對(duì)象本身的屬性和方法。
實(shí)例繼承到的方法的作用域是該實(shí)例對(duì)象內(nèi)部的執(zhí)行環(huán)境,可以訪問(wèn)實(shí)例能獲取到的所有屬性。通過(guò)this.property的方式可以得到實(shí)例對(duì)象能夠訪問(wèn)到的所有屬性和方法,包括自有屬性和繼承的屬性方法。demo中的實(shí)例對(duì)象cat可以訪問(wèn)到在Animal和Mammal及其原型中定義的所有屬性方法,這正是繼承的意義所在。
驗(yàn)證:
console.log(cat.mammal); //mammal console.log(cat.isMammal); //true console.log(cat.sayMammal()); //Is it mammal? true console.log(cat.animal); //animal console.log(cat.isAnimal); //true console.log(cat.sayAnimal()); //Is it animal? true
轉(zhuǎn)載請(qǐng)注明出處:https://segmentfault.com/a/1190000004550787
文章不定期更新完善,如果能對(duì)你有一點(diǎn)點(diǎn)啟發(fā),我將不勝榮幸。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/87726.html
摘要:對(duì)象具有自有屬性,也有一些屬性是從原型對(duì)象繼承而來(lái)的。為了更好地理解對(duì)象自有屬性和繼承屬性下面的示例深入解釋了屬性的訪問(wèn)和設(shè)置細(xì)節(jié)。在給對(duì)象的屬性賦值時(shí),是在原始對(duì)象上創(chuàng)建屬性或者對(duì)已有屬性賦值,而不會(huì)去修改原型鏈。 Javascript對(duì)象具有自有屬性(own property),也有一些屬性是從原型對(duì)象繼承而來(lái)的。為了更好地理解對(duì)象自有屬性和繼承屬性下面的示例深入解釋了屬性的訪問(wèn)和...
摘要:避免脆弱的基類問(wèn)題。紅牌警告沒有提到上述任何問(wèn)題。單向數(shù)據(jù)流意味著模型是單一的事實(shí)來(lái)源。單向數(shù)據(jù)流是確定性的,而雙向綁定可能導(dǎo)致更難以遵循和理解的副作用。原文地址 1. 你能說(shuō)出兩種對(duì) JavaScript 應(yīng)用開發(fā)者而言的編程范式嗎? 希望聽到: 2. 什么是函數(shù)編程? 希望聽到: 3. 類繼承和原型繼承的不同? 希望聽到 4. 函數(shù)式編程和面向?qū)ο缶幊痰膬?yōu)缺點(diǎn)? ...
摘要:使用異步編程,有一個(gè)事件循環(huán)。它作為面向?qū)ο缶幊痰奶娲桨?,其中?yīng)用狀態(tài)通常與對(duì)象中的方法搭配并共享。在用面向?qū)ο缶幊虝r(shí)遇到不同的組件競(jìng)爭(zhēng)相同的資源的時(shí)候,更是如此。 翻譯:瘋狂的技術(shù)宅原文:https://www.indeed.com/hire/i... 本文首發(fā)微信公眾號(hào):jingchengyideng歡迎關(guān)注,每天都給你推送新鮮的前端技術(shù)文章 不管你是面試官還是求職者,里面...
摘要:首先,需要來(lái)理清一些基礎(chǔ)的計(jì)算機(jī)編程概念編程哲學(xué)與設(shè)計(jì)模式計(jì)算機(jī)編程理念源自于對(duì)現(xiàn)實(shí)抽象的哲學(xué)思考,面向?qū)ο缶幊淌瞧湟环N思維方式,與它并駕齊驅(qū)的是另外兩種思路過(guò)程式和函數(shù)式編程。 JavaScript 中的原型機(jī)制一直以來(lái)都被眾多開發(fā)者(包括本人)低估甚至忽視了,這是因?yàn)榻^大多數(shù)人沒有想要深刻理解這個(gè)機(jī)制的內(nèi)涵,以及越來(lái)越多的開發(fā)者缺乏計(jì)算機(jī)編程相關(guān)的基礎(chǔ)知識(shí)。對(duì)于這樣的開發(fā)者來(lái)說(shuō) J...
摘要:最近剛剛看完了你不知道的上卷,對(duì)有了更進(jìn)一步的了解。你不知道的上卷由兩部分組成,第一部分是作用域和閉包,第二部分是和對(duì)象原型。附錄詞法這一章并沒有說(shuō)明機(jī)制,只是介紹了中的箭頭函數(shù)引入的行為詞法。第章混合對(duì)象類類理論類的機(jī)制類的繼承混入。 最近剛剛看完了《你不知道的 JavaScript》上卷,對(duì) JavaScript 有了更進(jìn)一步的了解。 《你不知道的 JavaScript》上卷由兩部...
閱讀 2574·2021-09-09 09:33
閱讀 2940·2019-08-30 15:56
閱讀 3209·2019-08-30 14:21
閱讀 964·2019-08-30 13:01
閱讀 958·2019-08-26 18:27
閱讀 3662·2019-08-26 13:47
閱讀 3534·2019-08-26 10:26
閱讀 1659·2019-08-23 18:38