js繼承的幾種方式

2021-09-23 05:58:11 字數 2091 閱讀 8285

看了w3school 上的ecmascript 繼承機制實現講的幾種方式,感覺還是有點亂,所以還是想再詳細理一下繼承的幾種方式,分享給大家

//建構函式繼承

function animal()

} function cat()

} console.log(new cat(),new animal());

animal.prototype.eat = function ()
再次列印結果

可以發現,當我們在原型鏈上新增屬性和方法時,子級並沒有繼承父級的屬性和方法

總結:建構函式繼承只能繼承在建構函式裡宣告的屬性和方法,不可以繼承父級原型鏈上的屬性和方法

//原型鏈繼承

function animal()

} function cat()

animal.prototype.eat = function ()

cat.prototype = new animal();

console.log(new cat(),new animal());

這種方式可以繼承原型鏈上的屬性,但是同樣有弊端

function animal() 

this.body = ['head','arm']

} function cat()

cat.prototype = new animal();

var cat1 = new cat();

var cat2 = new cat();

cat1.body.push('foot')

console.log(cat1,cat2);

檢視列印結果可以 ,我new了兩個例項物件後,改變其中乙個物件的屬性,另外乙個物件也會受到影響

總結:使用原型鏈繼承,會導致有乙個例項物件的屬性發生改變時,會被其他例項物件所共享

組合繼承其實就是講上述兩種方式結合在一起

//組合繼承

function animal()

this.body = ['head','arm'];

} function cat()

animal.prototype.eat = function ()

cat.prototype = new animal(); //animal函式呼叫一次

var cat1 = new cat();

var cat2 = new cat();

cat1.body.push('foot')

console.log(cat1,cat2);

觀察上述**,顯然animal被呼叫兩次,這無疑中增加了記憶體消耗

改進:

將cat.prototype = new animal();  替換成下面兩行
cat.prototype = object.create(animal.prototype);

cat.prototype.constructor = cat;

將cat原型物件設定成animal的原型物件,通過例項物件的_proto_可以一層層往父級查詢屬性和方法,cat.prototype的constructor還是animal,所以我們需要再次把他賦值成cat

總結:組合方式排除了建構函式繼承和原型鏈繼承的弊端,是js中最常用的繼承模式了

class 是es6新增的語法  

class  animal

play()

} class cat extends animal

} var cat = new cat();

console.log(cat.name)

直接class 建立乙個類,使用extends來繼承。

總結:最方便快捷的繼承方式,但是僅支援es6及以上版本,所以要考慮相容性問題,其他沒毛病

js繼承幾種方式

js作為物件導向的弱型別語言,繼承也是其非常強大的特性之一。那麼如何在js中實現繼承呢?讓我們拭目以待。既然要實現繼承,那麼首先我們得有乙個父類,如下 定義乙個動物類 function animal name 原型方法 animal.prototype.eat function food 核心 將父...

幾種js的繼承方式

1 繼承第一種方式 物件冒充 function super username function sub username var supernew new super super var subnew new sub sub supernew.hello subnew.hello subnew.wo...

js的幾種繼承方式

方式一 原型鏈繼承 function parent parent.prototype.getparentname function 子類 function child 下面這步實現繼承,這步需要放在getchildname 之前,不然獲得子類方法無法使用 child.prototype new pa...