摘要:想要解決這樣的問題的話,可以借助構(gòu)造函數(shù)也可以叫做偽造對(duì)象或經(jīng)典繼承。這種方式實(shí)現(xiàn)非常簡(jiǎn)單,就是在子對(duì)象的構(gòu)造函數(shù)中調(diào)用父對(duì)象的構(gòu)造函數(shù)。
原型式繼承
原型式繼承,就是一定一個(gè)函數(shù),該函數(shù)中創(chuàng)建一個(gè)臨時(shí)性的構(gòu)造函數(shù),將作為參數(shù),傳入的對(duì)象作為這個(gè)構(gòu)造函數(shù)的原型,最后返回這個(gè)構(gòu)造函數(shù)的實(shí)例對(duì)象
/*定義函數(shù):用于實(shí)現(xiàn)對(duì)象之間的繼承 參數(shù): obj:表示繼承關(guān)系中的父級(jí)對(duì)象 prop:對(duì)象格式,表示繼承關(guān)系中的子級(jí)對(duì)象的屬性和方法 */ function fn(obj,porp){ //定義一個(gè)臨時(shí)的構(gòu)造函數(shù) function Fun(){ //遍歷對(duì)象的屬性和方法 for(var attrName in porp){ this[attrName]=porp[attrName]; } } //將函數(shù)的參數(shù)作為構(gòu)造函數(shù)的原型 Fun.prototype=obj; //將構(gòu)造函數(shù)創(chuàng)建的對(duì)象進(jìn)行返回 return new Fun(); } var obj={ name:"前端" } //調(diào)用函數(shù) var result=fn(obj,{ age:20, sayMe:function(){ console.log("this is function"); } }); console.log(result.age); result.sayMe();
利用Object.create()方法實(shí)現(xiàn)繼承
var obj={ name:"前端" } var newObj=object.create(obj,{ age:{ value:20 }, sayMe:{ value:function(){ console.log("this is function"); } } }); console.log(newObj.age); newObj.sayMe();借助構(gòu)造函數(shù)
無(wú)論是原型鏈還是原型式繼承,都具有相同的問題。想要解決這樣的問題的話,可以借助構(gòu)造函數(shù)(也可以叫做偽造對(duì)象或經(jīng)典繼承)。
這種方式實(shí)現(xiàn)非常簡(jiǎn)單,就是在子對(duì)象的構(gòu)造函數(shù)中調(diào)用父對(duì)象的構(gòu)造函數(shù)。具體可以通過調(diào)用apply()和call()方法實(shí)現(xiàn)。
apply()和call()方法都允許傳遞指定某個(gè)對(duì)象的this。對(duì)于繼承來(lái)講,可以實(shí)現(xiàn)在子對(duì)象的構(gòu)造函數(shù)中調(diào)用父對(duì)象的構(gòu)造函數(shù)時(shí),將子對(duì)象的this和父對(duì)象的this綁定在一起
//定義父級(jí)對(duì)象的構(gòu)造函數(shù) function Parent(){ this.parent="parent"; } //定義子級(jí)對(duì)象的構(gòu)造函數(shù) function child(){ //調(diào)用父級(jí)對(duì)象的構(gòu)造函數(shù):使用apply()或call()方法 Parent.call(this); this.child="child"; } //創(chuàng)建子級(jí)對(duì)象 var child=new Child(); console.log(child);組合方式繼承
組合繼承,也叫做偽經(jīng)典繼承,指的是將原型鏈或原型式繼承和借助構(gòu)造函數(shù)的技術(shù)組合在一起,發(fā)揮二者長(zhǎng)處的一種繼承方式
具體實(shí)現(xiàn)的思路就是:
使用原型鏈或原型式繼承實(shí)現(xiàn)對(duì)原型的屬性和方法的繼承。
通過借助構(gòu)造函數(shù)實(shí)現(xiàn)對(duì)實(shí)例對(duì)象的屬性的繼承
這樣,既通過在原型上定義方法實(shí)現(xiàn)了函數(shù)的重用,又可以保證每個(gè)對(duì)象都有自己的專有屬性
function Parent(){ //構(gòu)造函數(shù)的自有屬性 this.name="前端"; } //構(gòu)造函數(shù)的原型屬性 Parent.prototype.age=20; function Child(){ //繼承父級(jí)構(gòu)造函數(shù)中的自有屬性 Parent.call(this); this.job="IT"; } //繼承父級(jí)構(gòu)造函數(shù)中的原型屬性 Child.prototype=Parent.prototype; var child=new Child(); console.log(child.job); console.log(child.age); console.log(child.name);
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/108365.html
摘要:組合方式實(shí)現(xiàn)繼承原型鏈構(gòu)造函數(shù)喵喵喵汪汪汪與的唯一區(qū)別是多了這一句組合方式實(shí)現(xiàn)了對(duì)構(gòu)造函數(shù)內(nèi)和原型上所有屬性和方法的繼承,并且的實(shí)例對(duì)象之間也不會(huì)相互干擾。 前言 關(guān)于JavaScript繼承相關(guān)的定義和方法網(wǎng)上已經(jīng)有很多解釋啦,本菜鳥就不抄抄寫寫惹人嫌了,本文主要探討三種基本的繼承方式并且給出優(yōu)化方案。 正文 借助構(gòu)造函數(shù)實(shí)現(xiàn)繼承 function Parent1() { ...
摘要:會(huì)造成內(nèi)存浪費(fèi)的問題構(gòu)造函數(shù)繼承聲明父類聲明子類生成實(shí)例組合式繼承組合式繼承是汲取了兩者的優(yōu)點(diǎn),既避免了內(nèi)存浪費(fèi),又使得每個(gè)實(shí)例化的子類互不影響。 寫在前面 既然是淺談,就不會(huì)從原理上深度分析,只是幫助我們更好地理解... 面向?qū)ο笈c面向過程 面向?qū)ο蠛兔嫦蜻^程是兩種不同的編程思想,剛開始接觸編程的時(shí)候,我們大都是從面向過程起步的,畢竟像我一樣,大家接觸的第一門計(jì)算機(jī)語(yǔ)言大概率都是C語(yǔ)...
摘要:可以通過構(gòu)造函數(shù)和原型的方式模擬實(shí)現(xiàn)類的功能。原型式繼承與類式繼承類式繼承是在子類型構(gòu)造函數(shù)的內(nèi)部調(diào)用超類型的構(gòu)造函數(shù)。寄生式繼承這種繼承方式是把原型式工廠模式結(jié)合起來(lái),目的是為了封裝創(chuàng)建的過程。 js繼承的概念 js里常用的如下兩種繼承方式: 原型鏈繼承(對(duì)象間的繼承) 類式繼承(構(gòu)造函數(shù)間的繼承) 由于js不像java那樣是真正面向?qū)ο蟮恼Z(yǔ)言,js是基于對(duì)象的,它沒有類的概念。...
摘要:化偽花貓偽,花,貓借助構(gòu)造函數(shù)無(wú)論是原型鏈還是原型式繼承,都有相同的問題。要解決這樣的問題,可以借助構(gòu)造函數(shù)也可以叫做偽造對(duì)象或經(jīng)典繼承。對(duì)于繼承來(lái)講,可以試想子對(duì)象的構(gòu)造函數(shù)中調(diào)用父對(duì)象的構(gòu)造函數(shù)時(shí),講子對(duì)象的和父對(duì)象的綁定在一起。 繼承 原型式繼承 所謂原型式繼承,就是定義一個(gè)函數(shù),該函數(shù)中創(chuàng)建一個(gè)臨時(shí)性的構(gòu)造函數(shù),并將作為參數(shù)傳入的對(duì)象作為這個(gè)構(gòu)造函數(shù)的原型,最后返回這個(gè)構(gòu)造函數(shù)...
摘要:不必在構(gòu)造函數(shù)中定義對(duì)象實(shí)例的信息。其次,按照一切事物皆對(duì)象的這餓極本的面向?qū)ο蟮姆▌t來(lái)說,類本身并不是一個(gè)對(duì)象,然而原型方式的構(gòu)造函數(shù)和原型本身也是個(gè)對(duì)象。第二個(gè)問題就是在創(chuàng)建子類型的實(shí)例時(shí),不能向超類型的構(gòu)造函數(shù)中傳遞參數(shù)。 前言 對(duì)象(Object)應(yīng)該算是js中最為重要的部分,也是js中非常難懂晦澀的一部分。更是面試以及框架設(shè)計(jì)中各出沒。寫這篇文章,主要參考與JavaScrip...
閱讀 667·2021-11-23 09:51
閱讀 3314·2021-10-11 10:58
閱讀 15488·2021-09-29 09:47
閱讀 3581·2021-09-01 11:42
閱讀 1297·2019-08-29 16:43
閱讀 1841·2019-08-29 15:37
閱讀 2121·2019-08-29 12:56
閱讀 1732·2019-08-28 18:21