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...