ES5形式
function fun() {
this.name = 'fun',
this.arr = [1,2,3]
}
fun.prototype.myLog = function() {
console.log(this.arr);
}
function cFun () {
fun.call(this) //call調(diào)用父函數(shù) 繼承父函數(shù)的屬性
this.type = 'child'
}
cFun.prototype = fun.prototype // 構(gòu)造函數(shù)的原型對(duì)象指向要繼承的父函數(shù)的原型對(duì)象
cFun.prototype.constructor = cFun
var c1 = new cFun()
console.log(c1);
c1.myLog()
console.log(c1 instanceof cFun); // true
console.log(f1 instanceof cFun); // true
執(zhí)行結(jié)果如圖:

image.png
缺點(diǎn):因?yàn)楦负瘮?shù)和子函數(shù)都是同一個(gè)對(duì)象,導(dǎo)致父函數(shù)和子函數(shù)的實(shí)例對(duì)象,在執(zhí)行instanceof時(shí),都為true 無(wú)法區(qū)分。
用Object.creacte(fun.prototype)創(chuàng)建中間對(duì)象的形式可以解決這個(gè)問(wèn)題
ES6形式
class Teacher {
constructor(name) {
this.name = name
this.age = 30
}
sayHi() {
console.log(`hello everyone,我叫${this.name}`);
}
}
class Student extends Teacher {
constructor(name) {
super(name)
this.name = name
}
sayHello() {
console.log(`大家好,我叫${this.name}`);
}
}
const stu1 = new Student('張三')
console.log(stu1);
stu1.sayHello()
stu1.sayHi()
結(jié)果如下:

image.png