4.所以就引出了最後一種模式————聖杯模式。
方法還是公有原型。
father.prototype
function f(){}
f.prototype = father.prototype
son.prototype = new f();
這個father.prototype是兩方的原型,f充當了乙個中間層,f.prototype = father.prototype,他倆·共用乙個原型,然後son和f要形成乙個關係,通過原型鏈的方式形成關係,現在son的原型等於new f,
new的f可以通過原型鏈的方式找到father.prototype,這也就形成了繼承,son依然可以繼承father.prototype,現在有個好處就是son想給自己的prototype加東西,不會影響father.prototype,因為son的原型是new f,new f的原型才是father.prototype,這是兩層關係,所以咱把這種東西提取出來,提取出乙個公式出來,封裝到乙個函式裡面,再次實現a繼承b。
這就實現了最終的繼承。
原型上都有乙個系統給咱們自帶的屬性叫constructor,constructor預設的值是不是指向他的建構函式,現在son的constructor理應是什麼?理應是出現son是吧,但是現在
他是father,怎麼來的?
現在son的原型是誰,是new f()吧,new f()身上有constructor嗎,物件身上都沒有吧,他是原型身上的,那現在再往上找,new f()的原型是誰,是father.prototype吧,father.prototype上面有沒有constructor,必須有啊,指的是father,所以son要訪問constructor的時候要指向father吧,指向紊亂了是吧,所以現在想把son的constructor歸位。
function inherit(target,origin);
f.prototype = origin.prototype;
target.prototype = new f();
target.prototype.constructor = target;
}
是不是這樣就完事了,
function inherit(target,origin);
f.prototype = origin.prototype;
target.prototype = new f();
target.prototype.constructor = target;
}father.prototype.lastname = "deng";
function father()
function son ()
inherit(son,father);
var son = new son();
var father = new father();
現在有乙個小問題:我把第三四行換個位置,還好使嗎?
function inherit(target,origin);
f.prototype = origin.prototype;
target.prototype = new f();
target.prototype.constructor = target;
}
是不是不好使了,還是原型指向的問題吧,new的時候是用的原來的原型,你後給人改了,已經晚了,人家已經new完了是吧,所以一定得在new之前改原型。
下節課來講一下一種高大上的寫法。
js原型繼承,聖杯模式繼承
1.call 可以呼叫函式 2.call 可以修改this指向,使用call 的時候,第乙個引數是修改後的this指向,引數2,引數3 使用逗號隔開 function fun x,y var obj call 可以呼叫函式 fun.call call 可以改變這個函式的this指向 此時這個函式的t...
JavaScript之繼承模式(聖杯模式)
1.傳統形式 過多的繼承了沒用的屬性 2.借用建構函式 不能繼承借用建構函式的原型 每次建構函式都要多走乙個函式 function person name,age,function student name,age,tel,grade 3.共享原型 不能隨便改動自己的原型 father.protot...
JS 聖杯模式(原型鏈繼承)
聖杯模式 為了son繼承father原型上的東西,還可以修改自己原型上的東西,對father原型不影響。function inherit target,origin 函式f作為乙個中間層,上連father,下連son,使兩函式互不干擾 f.prototype origin.prototype tar...