-
1 # 你永遠追不上的巨人
-
2 # 藍風24
原型鏈繼承
核心: 將父類的例項作為子類的原型
構造繼承
核心:使用父類的建構函式來增強子類例項,等於是複製父類的例項屬性給子類(沒用到原型)
例項繼承
核心:為父類例項新增新特性,作為子類例項返回
組合繼承
核心:透過呼叫父類構造,繼承父類的屬性並保留傳參的優點,然後透過將父類例項作為子類原型,實現函式複用
寄生組合繼承
核心:透過寄生方式,砍掉父類的例項屬性,這樣,在呼叫兩次父類的構造的時候,就不會初始化兩次例項方法/屬性,避免的組合繼承的缺點
-
3 # 你永遠追不上的巨人
1.JS類式繼承:/*--類式繼承--*///先宣告一個超類functionPerson(name){this.name=name;}//給這個超類的原型物件上新增方法getNamePerson.prototype.getName=function(){returnthis.name;}//例項化這個超vara=newPerson("Darren1")console.log(a.getName());//Darren1//再宣告類functionProgrammer(name,sex){//這個類中要呼叫超類Person的建構函式,並將引數name傳給它Person.call(this,name);this.sex=sex;}//這個子類的原型物件等於超類的例項Programmer.prototype=newPerson();//因為子類的原型物件等於超類的例項,所以prototype.constructor這個方法也等於超類建構函式,你可以自己測試一下,如果沒這一步,console.log(Programmer.prototype.constructor這個是Person超類的引用,所以要從新賦值為自己本身console.log(Programmer.prototype.constructor);/*functionPerson(name){this.name=name;}*/Programmer.prototype.constructor=Programmer;console.log(Programmer.prototype.constructor);/*functionProgrammer(name,sex){Person.call(this,name);this.sex=sex;}*///子類本身添加了getSex方法Programmer.prototype.getSex=function(){returnthis.sex;}//例項化這個子類var_m=newProgrammer("Darren2","male");//自身的方法console.log(_m.getSex());//male//繼承超類的方法console.log(_m.getName());//Darren22.JS原型繼承:/*--原型式繼承--*///clone()函式用來建立新的類Person物件varclone=function(obj){4var_f=function(){};//這句是原型式繼承最核心的地方,函式的原型物件為物件字面量_f.prototype=obj;returnnew_f;}//先宣告一個物件字面量varPerson={name:"Darren",getName:function(){returnthis.name;}}//不需要定義一個Person的子類,只要執行一次克隆即可varProgrammer=clone(Person);//可以直接獲得Person提供的預設值,也可以新增或者修改屬性和方法alert(Programmer.getName())Programmer.name="Darren2"alert(Programmer.getName())//宣告子類,執行一次克隆即可varSomeone=clone(Programmer);
-
4 # 藍風24
原型鏈繼承
核心: 將父類的例項作為子類的原型
構造繼承
核心:使用父類的建構函式來增強子類例項,等於是複製父類的例項屬性給子類(沒用到原型)
例項繼承
核心:為父類例項新增新特性,作為子類例項返回
組合繼承
核心:透過呼叫父類構造,繼承父類的屬性並保留傳參的優點,然後透過將父類例項作為子類原型,實現函式複用
寄生組合繼承
核心:透過寄生方式,砍掉父類的例項屬性,這樣,在呼叫兩次父類的構造的時候,就不會初始化兩次例項方法/屬性,避免的組合繼承的缺點
回覆列表
1.JS類式繼承:/*--類式繼承--*///先宣告一個超類functionPerson(name){this.name=name;}//給這個超類的原型物件上新增方法getNamePerson.prototype.getName=function(){returnthis.name;}//例項化這個超vara=newPerson("Darren1")console.log(a.getName());//Darren1//再宣告類functionProgrammer(name,sex){//這個類中要呼叫超類Person的建構函式,並將引數name傳給它Person.call(this,name);this.sex=sex;}//這個子類的原型物件等於超類的例項Programmer.prototype=newPerson();//因為子類的原型物件等於超類的例項,所以prototype.constructor這個方法也等於超類建構函式,你可以自己測試一下,如果沒這一步,console.log(Programmer.prototype.constructor這個是Person超類的引用,所以要從新賦值為自己本身console.log(Programmer.prototype.constructor);/*functionPerson(name){this.name=name;}*/Programmer.prototype.constructor=Programmer;console.log(Programmer.prototype.constructor);/*functionProgrammer(name,sex){Person.call(this,name);this.sex=sex;}*///子類本身添加了getSex方法Programmer.prototype.getSex=function(){returnthis.sex;}//例項化這個子類var_m=newProgrammer("Darren2","male");//自身的方法console.log(_m.getSex());//male//繼承超類的方法console.log(_m.getName());//Darren22.JS原型繼承:/*--原型式繼承--*///clone()函式用來建立新的類Person物件varclone=function(obj){4var_f=function(){};//這句是原型式繼承最核心的地方,函式的原型物件為物件字面量_f.prototype=obj;returnnew_f;}//先宣告一個物件字面量varPerson={name:"Darren",getName:function(){returnthis.name;}}//不需要定義一個Person的子類,只要執行一次克隆即可varProgrammer=clone(Person);//可以直接獲得Person提供的預設值,也可以新增或者修改屬性和方法alert(Programmer.getName())Programmer.name="Darren2"alert(Programmer.getName())//宣告子類,執行一次克隆即可varSomeone=clone(Programmer);