繼承之構造器借用法

2021-08-06 06:25:16 字數 1752 閱讀 9868

還是用書上的例子開始介紹吧:

function shape(id)

shape.prototype.name='shape';

shape.prototype.say=function()

function ********()

********.prototype=new shape();

********.prototype.name='********';

var t=new ********(121);

console.log(t.name);//********

console.log(t.child);//true

t.say();//******** 121

我們建立了乙個shape構造器函式(相當於我們的「父類」),然後建立了********構造器函式(「子類」),然後我們例項了********這個物件;我們發現

父物件的this值繫結起來;然後通過將子物件的原型物件賦值我們父物件的例項,使得子物件可以使用父物件原型上的方法和屬性,之所以例項乙個對

象是為了對子物件原型改變的時候不會對父物件產生影響;

有心的朋友可能注意到了我上篇寫的原型陷阱,這裡我們將子物件的原型全部覆蓋後並沒有再重置子物件原型constructor屬性,是因為我們這裡是繼承

呀~我們就是要繼承父物件原型上的方法,然後我們可以再在我們的原型上新增資料就ok了,進行子物件原型方法的擴充套件;

這樣我們就實現了構造器借用法實現繼承,不過這裡會存在乙個問題,就是我們的父物件的構造器會被呼叫兩次!

就好比我上面的這個id屬性,在t中其實是有2個,真正的來說是其建構函式********有2個id,乙個在其自身屬性上,乙個在其原型物件上;

我們列印一下:

console.log(********.prototype);//shape 

console.log(t);//********

當然我們知道當私有屬性上和原型上都有同乙個屬性或者方法的時候會優先用私有屬性上,所以我們列印t.id會是121,不會是undefined,但是這樣還是不好,會造成混淆;

我們的解決辦法就是將其建構函式上原型的方法使用物件複製,不new乙個例項;

我們需要實現乙個物件拷貝的函式:

function deepcopy(parent,child);

for(var i in parent);

deepcopy(parent[i],child[i]);

}else

}return child;

}

然後將其父物件上的原型拷貝給子物件的原型

deepcopy(shape.prototype,********.prototype)

但是這個方法又有乙個問題,如果我父物件在原型上再擴充套件的活,那麼這邊子物件是無法獲取到父物件的新擴充套件方法和屬性的,或者我們可以在父物件擴充套件的時候再對子物件進行拷貝一下,不過這次可以判斷一下,重複的就不用新增了。目前就只想到這種比較笨的辦法了-。-

function deepcopy(parent,child);

for(var i in parent);

deepcopy(parent[i],child[i]);

}else

}} return child;

}

借用構造函式呼叫繼承

function father name,age 這樣直接呼叫,那麼father中的this只的是 window。因為其實這樣呼叫的 window.father 李四 20 name 和age 屬性就新增到了window屬性上 father 李四 20 alert name window.name ...

借用建構函式實現繼承

在子型別建構函式的內部呼叫超型別的建構函式 function supertype function subtype var instance1 new subtype instance1.colors.push yellow console.log instance1.colors var inst...

繼承方式二 借用建構函式

function supertype function subtype var instance1 newsubtype instance1.colors.push black console.log instance1.colors red blue green black var instanc...