es5繼承與es6繼承

2021-10-02 12:00:35 字數 2331 閱讀 9579

es5中的繼承方式:

1. 原型鏈繼承

缺點:1. 建立例項時無法像父類建構函式傳遞引數;

2. 因為指定了原型,所以不能實現多繼承;

3. 父類建構函式上的屬性被所有子類共用,給原型上的屬性賦值會改變其他子類的屬性值;

// es5

const parent = function (name, age)

parent.prototype.sayname = function ()

function child (***)

/* child.prototype = new parent()

let p1 = new child('json')

p1.sayname() // console.log('my name is ', p1.name)

let p2 = new child('ketty')

p2.sayname()

// my name is undefined

// my name is undefined

*//**

child.prototype = new parent('cole')

let p1 = new child('json')

p1.sayname()

let p2 = new child('ketty')

p2.sayname()

// my name is cole

// my name is cole

*/child.prototype = new parent()

let p1 = new child()

p1.__proto__.name = "json"

p1.sayname()

let p2 = new child()

p2.sayname()

// my name is json

// my name is json

p2.name = 'aa'

p1.sayname()

p2.sayname()

// my name is json

// my name is aa

2. 建構函式繼承

可以多繼承,只要執行多個call方法即可;建立例項時能像父類建構函式傳遞引數;不會出現父類屬性,所有子類建構函式共享

缺點: 不能繼承父類原型鏈上的方法(如sayname方法),所以要繼承的函式只能定義在父類的建構函式上,不能到達函式復用;子類建構函式的例項,原型鏈上並不存在父類構建函式

function parent(name) 

parent.prototype.sayname = function ()

let a = new parent('json')

a.sayname()

function child (name, ***)

let p = new child('yarn', 8)

console.log('my name is ', p.name)

p.sayname() // 報錯

3.組合繼承,融合以上兩種方式

function parent(name) 

parent.prototype.sayname = function ()

function child (name, ***)

child.prototype = new parent()

// child.prototype = object.create(parent.prototype) //寄生組合繼承

child.prototype.constructor = child

let p = new child('yarn', 8)

console.log('my name is ', p.name)

p.sayname()

es6中的繼承

es6中使用extend實現繼承

class person 

sayname ()

}class child extends person

}let p = new child('czklove','23','man')

console.log(p)

prototype與__proto__

1. 物件有__proto__屬性, 函式有prototype屬性;

2. 物件由函式生成;

3. 生成物件時,物件的__proto__屬性指向函式的prototype屬性

ES6與ES5的繼承

類與es5中的建構函式寫法類似 區別在於屬性要放入constructor中,靜態方法和屬性實列不會繼承 子類與父類不會相互影響 es5 這三個函式是用來改變this的指向。聽不懂沒關係,我們來看個例子就明白。繼承 子類繼承父類所有屬性和行為,父類不受影響。目的 找到類之間的共性,精簡 提高 復用性,...

ES5與ES6繼承的區別

2.es6的繼承機制完全不同,實質上是先建立父類的例項物件this 所以必須先呼叫父類的super 方法 然後再用子類的建構函式修改this。3.es5的繼承時通過原型或建構函式機制來實現。4.es6通過class關鍵字定義類,裡面有構造方法,類之間通過extends關鍵字實現繼承。子類必須在con...

ES6 與 ES5 繼承的區別

es6 中有類 class 的概念,類 class 的繼承是通過 extends 來實現的,es5 中是通過設定建構函式的 prototype 屬性,來實現繼承的,es6 與 es5 的繼承有什麼區別呢?下面通過 3 個 demo,來分析它們之間的區別。1.es5 繼承 直接上 function a...