摘要:有需要還可以修改指向謙龍寄生組合式繼承思路是通過借用構造函數來繼承屬性,通過原型鏈的混合形式來繼承方法改變執行環境實現繼承有需要還可以修改指向謙龍謙龍拷貝繼承該方法思路是將另外一個對象的屬性和方法拷貝至另一個對象使用遞歸
前言
原型鏈式繼承js中實現繼承的方式只支持實現繼承,即繼承實際的方法,而實現繼承主要是依靠原型鏈來完成的。
該方式實現的本質是重寫原型對象,代之以一個新類型的實例。
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
借用純原型鏈的問題:如果原型中包含引用類型的值,則實例間對該值的修改會相互影響,這不是我們希望看到的。
借用構造函數該方式的基本思想是在子類型的構造函數的內部調用超類型構造函數(父函數)
function SuperType(){ this.color=["green","red","black"]; } function SubType(){ SuperType.call(this)//改變執行環境 實現繼承 } 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" ]
構造函數的問題:方法都在構造函數內部定義,則函數復用無從談起。
組合繼承基本思路是使用原型鏈來實現對原型屬性和方法的繼承,通過構造函數實現實例屬性的繼承
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)//改變執行環境 實現實例屬性繼承 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"]原型式繼承
該方法的特點是借助原型可以基于一個已有的對象創建新的對象,同時還不比因此創建自定義類型
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()與該方式的行為相同
寄生式繼承該方式的思路是創建一個僅用來封裝繼承過程的函數,該函數在內部以某種方式來增強對象,最后將該對象返回。
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();寄生組合式繼承
思路是通過借用構造函數來繼承屬性,通過原型鏈的混合形式來繼承方法
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)//改變執行環境 實現繼承 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"]拷貝繼承
該方法思路是將另外一個對象的屬性和方法拷貝至另一個對象
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);
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/86150.html
摘要:設計模式是以面向對象編程為基礎的,的面向對象編程和傳統的的面向對象編程有些差別,這讓我一開始接觸的時候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續了解設計模式必須要先搞懂面向對象編程,否則只會讓你自己更痛苦。 JavaScript 中的構造函數 學習總結。知識只有分享才有存在的意義。 是時候替換你的 for 循環大法了~ 《小分享》JavaScript中數組的那些迭代方法~ ...
摘要:委托上面的代碼結合了構造函數和原型兩種方式去創建對象,首先聊聊構造函數構造函數構造函數本質上還是函數,只不過為了區分將其首字母大寫了而已。注意注釋掉的代碼是自動執行的,但這并不是構造函數獨有的,每個函數在聲明時都會自動生成。 首先看看下面兩個1+1=2的問題: 問題一:為什么改變length的值,數組的內容會變化? var arr = [1]; arr.length = 3; aler...
摘要:前言面試中對于技術職位,一般分筆試與面談,如果面試官的一些小問題你可以立馬找到對應的知識點擴展開來,那么這就是你的優勢,本系列將講述一些面試中的事,不會很詳細,但是應該比較全面吧。 前言 面試中對于技術職位,一般分筆試與面談,如果面試官的一些小問題你可以立馬找到對應的知識點擴展開來,那么這就是你的優勢,本系列將講述一些java面試中的事,不會很詳細,但是應該比較全面吧。 主要內容 pa...
摘要:很多情況下,通常一個人類,即創建了一個具體的對象。對象就是數據,對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個人類,即創建了一個具體的對象。對象就是數據,對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
閱讀 1967·2021-10-25 09:48
閱讀 2797·2021-09-22 14:59
閱讀 1759·2019-08-29 16:52
閱讀 865·2019-08-29 16:07
閱讀 2306·2019-08-29 12:38
閱讀 1757·2019-08-26 13:23
閱讀 878·2019-08-26 11:49
閱讀 3272·2019-08-26 10:56