建構函式的繼承方式

2021-09-27 19:23:24 字數 2915 閱讀 5252

主要分為兩部分,第一部分是es5環境下的繼承,另外一部分是es6部分的繼承,首先先看es5,如何通過建構函式的形式實現繼承。

1:原型鏈繼承

function

foo(name)

foo.prototype.age = function

() ;

function

fn (name)

fn.prototype = new

fn();

fn.prototype.age = function

() ;

var a = new fn('lisi');

a.age();

這種方法缺點比較明顯,看起來很不直觀,而且子類的方法不能優先於父類方法出現,通過new呼叫時,不能直接呼叫父類的建構函式而是要呼叫子類。

2:類式繼承

function

foo(name)

foo.prototype.age = function

() ;

foo.prototype.obj = function

() ;

function

fn (name)

fn.prototype.age = function

() ;

var a = new fn('lisi');

a.age();

a.obj();

//typeerror: a.obj is not a function

這裡通過call的方法,將this繫結在foo建構函式上執行,但是會導致沒有自己的原型物件,無法共享原型的方法和屬性。
3:組合式繼承
function

foo(name)

foo.prototype.age = function

() ;

foo.prototype.obj = function

() ;

function

fn (name)

fn.prototype = new foo(); //

第一次呼叫

fn.prototype.constructor =fn;

fn.prototype.age = function

() ;

fn.prototype.set = function

() ;

var a = new fn('lisi');

a.age();

a.obj();

a.set();

這是比較常用的繼承方法,通過呼叫兩次實現了繼承,具備了原型鏈繼承和類式繼承的優點也可以自己定製方法或者屬性。

不過缺點就是第一次呼叫foo函式,實際上我們只是想獲取原型,你可能在想如果通過

fn.prototype = foo.prototype;

的方法實現,不過很可惜,這種方法是錯誤的,因為這會導致,兩個函式的prototype屬性發生改變,這顯然是沒有必要的。

這也是第四種繼承的由來。

4:寄生組合式繼承
function

foo(name)

foo.prototype.age = function

() ;

foo.prototype.obj = function

() ;

function

fn (name)

fn.prototype =object.create(foo.prototype);

fn.prototype.constructor =fn;

fn.prototype.age = function

() ;

fn.prototype.set = function

() ;

var a = new fn('lisi');

a.age();

a.obj();

a.set();

這裡使用了object.create()方法,事實上你也可以通過這種方法自己模擬乙個,使用這種方法繼承,可以讓foo這個函式只執行一次。

function

create(arr)

foo.prototype =arr;

return

newfoo();

}

5:多重繼承(混合繼承)
function

foo(name)

function

fn(arr)

function

obj(name, age)

obj.prototype =object.create(foo.prototype);

object.assign(obj.prototype, fn.prototype);

obj.prototype.constructor =obj;

var a = new obj('zhangsan', 18);

console.log(a);

//obj

class繼承

class是es6新增的,繼承通過extends實現

class foo 

age()

obj()

}class fn extends foo

age() `);

}}var a = new fn('zhangsan');

a.age();

a.obj();

C 建構函式 繼承方式

構造方法用來初始化類的物件,與父類的其它成員不同,它不能被子類繼承 子類可以繼承父類所有的成員變數和成員方法,但不繼承父類的構造方法 因此,在建立子類物件時,為了初始化從父類繼承來的資料成員,系統需要呼叫其父類的構造方法。如果沒有顯式的建構函式,編譯器會給乙個預設的建構函式,並且該預設的建構函式僅僅...

繼承方式二 借用建構函式

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

建構函式的繼承

在父類中定義了2個建構函式,在子類中,也定義了2個建構函式。當執行子類時,可以發現先呼叫父類的建構函式,在呼叫子類的建構函式。實驗四 建構函式的繼承 實驗內容 在父類中,定義了2個建構函式,在子類中,也定義了2個建構函式。編寫 程式顯示父類 子類建構函式的呼叫過程,在子類中實現建構函式的繼承。pac...