摘要:有需要還可以修改指向謙龍寄生組合式繼承思路是通過借用構(gòu)造函數(shù)來繼承屬性,通過原型鏈的混合形式來繼承方法改變執(zhí)行環(huán)境實(shí)現(xiàn)繼承有需要還可以修改指向謙龍謙龍拷貝繼承該方法思路是將另外一個(gè)對(duì)象的屬性和方法拷貝至另一個(gè)對(duì)象使用遞歸
前言
原型鏈?zhǔn)嚼^承js中實(shí)現(xiàn)繼承的方式只支持實(shí)現(xiàn)繼承,即繼承實(shí)際的方法,而實(shí)現(xiàn)繼承主要是依靠原型鏈來完成的。
該方式實(shí)現(xiàn)的本質(zhì)是重寫原型對(duì)象,代之以一個(gè)新類型的實(shí)例。
function SuperType(){ this.property=true; } SuperType.prototype.getSuperValue=function(){ return this.property; } function SubType(){ this.subproperty=false; } SubType.prototype = new SuperType();//繼承 SubType.prototype.getSubValue=function(){//額外添加方法 return this.subproperty; } var s = new SubType(); console.log(s.getSubValue());//false console.log(s.getSuperValue());//true
借用純?cè)玩湹膯栴}:如果原型中包含引用類型的值,則實(shí)例間對(duì)該值的修改會(huì)相互影響,這不是我們希望看到的。
借用構(gòu)造函數(shù)該方式的基本思想是在子類型的構(gòu)造函數(shù)的內(nèi)部調(diào)用超類型構(gòu)造函數(shù)(父函數(shù))
function SuperType(){ this.color=["green","red","black"]; } function SubType(){ SuperType.call(this)//改變執(zhí)行環(huán)境 實(shí)現(xiàn)繼承 } var s = new SubType(); s.color.push("pink"); console.log(s.color);//[ "green", "red", "black", "pink" ] var s1 = new SubType(); console.log(s1.color);//[ "green", "red", "black" ]
構(gòu)造函數(shù)的問題:方法都在構(gòu)造函數(shù)內(nèi)部定義,則函數(shù)復(fù)用無從談起。
組合繼承基本思路是使用原型鏈來實(shí)現(xiàn)對(duì)原型屬性和方法的繼承,通過構(gòu)造函數(shù)實(shí)現(xiàn)實(shí)例屬性的繼承
function SuperType(name){ this.name=name; this.color=["green","red","black"]; } SuperType.prototype.show=function(){ console.log(this.name,this.color); } function SubType(name,age){ SuperType.call(this,name)//改變執(zhí)行環(huán)境 實(shí)現(xiàn)實(shí)例屬性繼承 this.age=age; } SubType.prototype = new SuperType();//原型屬性和方法繼承 var s = new SubType("謙龍",100); s.show();//謙龍 ["green", "red", "black"] var s = new SubType("雛田",14); s.show();//雛田 ["green", "red", "black"]原型式繼承
該方法的特點(diǎn)是借助原型可以基于一個(gè)已有的對(duì)象創(chuàng)建新的對(duì)象,同時(shí)還不比因此創(chuàng)建自定義類型
function object(obj){ function F(){}; F.prototype=obj; //F.prototype.constructor=F; 有需要還可以修改constructor指向 return new F(); } var person={ name:"謙龍", color:["red","green","black"] } var p1 = object(person); p1.color.push("pink"); var p2 = object(person); p2.color.push("grey"); console.log(person.color);//["red", "green", "black", "pink", "grey"]
ES5中的Object.creat()與該方式的行為相同
寄生式繼承該方式的思路是創(chuàng)建一個(gè)僅用來封裝繼承過程的函數(shù),該函數(shù)在內(nèi)部以某種方式來增強(qiáng)對(duì)象,最后將該對(duì)象返回。
function object(obj){ function F(){}; F.prototype=obj; //F.prototype.constructor=F; 有需要還可以修改constructor指向 return new F(); } function CObject(obj){ var clone=object(obj); clone.sayHi=function(){ alert("HI"); } return clone; } var person={ name:"謙龍", color:["red","green","black"] } var s = CObject(person); s.sayHi();寄生組合式繼承
思路是通過借用構(gòu)造函數(shù)來繼承屬性,通過原型鏈的混合形式來繼承方法
function SuperType(name){ this.name=name; this.color=["green","red","black"]; } SuperType.prototype.show=function(){ console.log(this.name,this.color); } function SubType(name,age){ SuperType.call(this,name)//改變執(zhí)行環(huán)境 實(shí)現(xiàn)繼承 this.age=age; } function object(obj){ function F(){}; F.prototype=obj; //F.prototype.constructor=F; 有需要還可以修改constructor指向 return new F(); } function inheritPrototype(subType,superType){ var prototype=object(superType.prototype); prototype.constructor=subType; subType.prototype=prototype; } inheritPrototype(SubType,SuperType); var s = new SubType("謙龍",100); s.show();//謙龍 ["green", "red", "black"]拷貝繼承
該方法思路是將另外一個(gè)對(duì)象的屬性和方法拷貝至另一個(gè)對(duì)象
function deepCopy(obj){ if(typeof obj !="object"){ console.trace(); return obj; } var newObj={}; for(var attr in obj){ newObj[attr]=typeof obj[attr]=="object"?deepCopy(obj[attr]):obj[attr];//使用遞歸 } return newObj; } var obj={ name:"min", age:20, sex:"boy", json:{ name2:"huihui", json3:{ name3:"yahui" } } } var newObj=deepCopy(obj); console.log(newObj);
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/86150.html
摘要:設(shè)計(jì)模式是以面向?qū)ο缶幊虨榛A(chǔ)的,的面向?qū)ο缶幊毯蛡鹘y(tǒng)的的面向?qū)ο缶幊逃行┎顒e,這讓我一開始接觸的時(shí)候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續(xù)了解設(shè)計(jì)模式必須要先搞懂面向?qū)ο缶幊?,否則只會(huì)讓你自己更痛苦。 JavaScript 中的構(gòu)造函數(shù) 學(xué)習(xí)總結(jié)。知識(shí)只有分享才有存在的意義。 是時(shí)候替換你的 for 循環(huán)大法了~ 《小分享》JavaScript中數(shù)組的那些迭代方法~ ...
摘要:委托上面的代碼結(jié)合了構(gòu)造函數(shù)和原型兩種方式去創(chuàng)建對(duì)象,首先聊聊構(gòu)造函數(shù)構(gòu)造函數(shù)構(gòu)造函數(shù)本質(zhì)上還是函數(shù),只不過為了區(qū)分將其首字母大寫了而已。注意注釋掉的代碼是自動(dòng)執(zhí)行的,但這并不是構(gòu)造函數(shù)獨(dú)有的,每個(gè)函數(shù)在聲明時(shí)都會(huì)自動(dòng)生成。 首先看看下面兩個(gè)1+1=2的問題: 問題一:為什么改變length的值,數(shù)組的內(nèi)容會(huì)變化? var arr = [1]; arr.length = 3; aler...
摘要:前言面試中對(duì)于技術(shù)職位,一般分筆試與面談,如果面試官的一些小問題你可以立馬找到對(duì)應(yīng)的知識(shí)點(diǎn)擴(kuò)展開來,那么這就是你的優(yōu)勢(shì),本系列將講述一些面試中的事,不會(huì)很詳細(xì),但是應(yīng)該比較全面吧。 前言 面試中對(duì)于技術(shù)職位,一般分筆試與面談,如果面試官的一些小問題你可以立馬找到對(duì)應(yīng)的知識(shí)點(diǎn)擴(kuò)展開來,那么這就是你的優(yōu)勢(shì),本系列將講述一些java面試中的事,不會(huì)很詳細(xì),但是應(yīng)該比較全面吧。 主要內(nèi)容 pa...
摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來。注意中,對(duì)象一定是通過類的實(shí)例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來。注意中,對(duì)象一定是通過類的實(shí)例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
閱讀 2021·2021-10-25 09:48
閱讀 2888·2021-09-22 14:59
閱讀 1817·2019-08-29 16:52
閱讀 930·2019-08-29 16:07
閱讀 2376·2019-08-29 12:38
閱讀 1846·2019-08-26 13:23
閱讀 936·2019-08-26 11:49
閱讀 3348·2019-08-26 10:56