javascript
浅谈javascript继承【读javascript设计模式第四章节继承有感】
javascript繼承,無任是類式繼承,原型式繼承還是滲元式繼承都是通過不同方法去圍繞著prototype轉(zhuǎn),簡單分析下三種不同繼承方法是如何圍繞prototype轉(zhuǎn)的
一:類似繼承,先上關(guān)鍵代碼
function extend(subClass,supClass){
var fn = function(){};
fn.prototype = supClass.prototype;
subClass.prototype = new fn();
subClass.prototype.constructor = subClass;
subClass.supClass = supClass;?? ??? ????
if(supClass.prototype.constructor == Object){
supClass.prototype.constructor = supClass;
}?
}
首先通過代碼可以看出這個是類與類的繼承,通過把子類的prototype設置成new一個空的構(gòu)造函數(shù),改空的構(gòu)造函數(shù)的prototype是父級類的prototype,好處是類與類之間的結(jié)構(gòu)比較明確,
使用參考代碼:
?
function FormField(){
this.init.apply(this,arguments)
}
FormField.prototype = {
init:function(){
console.log("init");
this.bind();
},
bind:function(){
console.log("bind");
}
};
function FormArea(){
this.constructor.supClass.call(this);
};
extend(FormArea,FormField);
var formArea = new FormArea();
?
二:原型式繼承,先上關(guān)鍵代碼
function clone(obj){
var fn = function(){};
fn.prototype = obj;
return new fn();
}
該方式優(yōu)點是節(jié)約內(nèi)存,無需上面那些類的各種指向,當前方式的有點恰巧也是他的缺點,改方式會共享他們的指針,特別是當指向的是一個對象或者數(shù)組的時候,得小心,clone出來的同事要重新復制替換掉之前的指向,另外同類式繼承最大的區(qū)別,是類式繼承是通過prototype = new XXX(某個父類),而原型是直接把prototype設置成一個字面量對象,
使用參考代碼:
var formField = {
init:function(){
}
}
var formArea = clone(formField);
formArea.init();
?
三:滲元式,先上關(guān)鍵代碼
function augment(receveClass,giveClass){
if(arguments.length == 2){
for(var i in giveClass.prototype){
if(!receveClass.prototype[i]){
receveClass.prototype[i] = giveClass.prototype[i]
?? }
}
}else{
var args = [].slice.call(arguments,2);
for(var j=0, len=args.length; j<len; j++){
if(!receveClass.prototype[args[j]]){
receveClass.prototype[args[j]] = giveClass.prototype[args[j]];
}
}
}
}
由于javascript是不能實現(xiàn)繼承多個父類的,因為它就一個prototype,所以可以通過上面的方法去擴展prototype的方式去模擬繼承多個父類的效果,
使用參考代碼:
function Minx(){}
Minx.prototype = {
sayName:function(){
p("sayName")
},
sayAge:function(){
p(29);
}
}?? ????
function Person(){};
augment(Person,Minx,"sayName");
var p1 = new Person();
p1.sayName();
?
總結(jié):
適應場合:方式一適合構(gòu)造過程中需要傳值去區(qū)分不同對象的情況,方式二適合帶有很多默認屬性,而大部分默認屬性又都相同場合,且比較節(jié)約內(nèi)存,方式三適合多個差異度很大的累,但是這些類里的某個方式又一樣的場合下
?
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/samKR/p/3785199.html
總結(jié)
以上是生活随笔為你收集整理的浅谈javascript继承【读javascript设计模式第四章节继承有感】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 正则在php中的使用
- 下一篇: 精读《javascript高级程序设计》