1. 構(gòu)造函數(shù)繼承
問題:原型上的方法或者屬性茂蚓,無法繼承
function Fn() {
this.name = "zhangsan",
this.age = 12
this.eat = function () {
console.log("eat")
}
}
Fn.prototype.sleep = function () {
console.log("sleep")
} // 無法繼承
function F() {
// console.log(this)
// Array.prototype.join.call(obj,'-') / Array.prototype.join.apply(obj,['-'])
Fn.call(this)
}
var fn = new Fn()
console.log(fn)
var f = new F()
console.log(f.sleep())
重點(diǎn):用.call()和.apply()將父類構(gòu)造函數(shù)引入子類函數(shù)(在子類函數(shù)中做了父類函數(shù)的自執(zhí)行(復(fù)制))
特點(diǎn):1剪芥、只繼承了父類構(gòu)造函數(shù)的屬性垄开,沒有繼承父類原型的屬性。
2税肪、解決了原型鏈繼承缺點(diǎn)1说榆、2虚吟、3寸认。
3签财、可以繼承多個(gè)構(gòu)造函數(shù)屬性(call多個(gè))。
4偏塞、在子實(shí)例中可向父實(shí)例傳參唱蒸。
缺點(diǎn):1、只能繼承父類構(gòu)造函數(shù)的屬性灸叼。
2神汹、無法實(shí)現(xiàn)構(gòu)造函數(shù)的復(fù)用。(每次用每次都要重新調(diào)用)
3古今、每個(gè)新實(shí)例都有父類構(gòu)造函數(shù)的副本屁魏,臃腫。
2捉腥、 原型繼承
問題: 共用一個(gè)原型對象氓拼,導(dǎo)致誰修改原型對象的值,其余對象都會被更改
function Fn() {
this.name = "zhangsan"
this.age = 12
this.color = ["yellow", "pink"]
this.eat = function () {
console.log("eat")
}
}
Fn.prototype.sleep = function () {
console.log("sleep")
}
function F() {
}
F.prototype = new Fn()
var f = new F()
var f1 = new F()
f.color.push("black")
console.log(f1.color)
重點(diǎn):讓新實(shí)例的原型等于父類的實(shí)例抵碟。
特點(diǎn):1桃漾、實(shí)例可繼承的屬性有:實(shí)例的構(gòu)造函數(shù)的屬性,父類構(gòu)造函數(shù)屬性拟逮,父類原型的屬性撬统。(新實(shí)例不會繼承父類實(shí)例的屬性!)
缺點(diǎn):1敦迄、新實(shí)例無法向父類構(gòu)造函數(shù)傳參恋追。
2、繼承單一罚屋。
3苦囱、所有新實(shí)例都會共享父類實(shí)例的屬性。(原型上的屬性是共享的沿后,一個(gè)實(shí)例修改了原型屬性沿彭,另一個(gè)實(shí)例的原型屬性也會被修改!)
3尖滚、組合方式繼承:
function Fn() {
this.name = "zhangsan"
this.age = 12
this.color = ["yellow", "pink"]
this.eat = function () {
console.log("eat")
}
}
function F() {
Fn.call(this)
}
F.prototype = Object.create(Fn.prototype)
// F.prototype = Fn.prototype.constructor === Fn
F.prototype.constructor = F
var f = new F()
var f1 = new F()
f.color.push("black")
console.log(f1.color)
function FCC() { }
//instanceof 用來
console.log(f instanceof FCC) //true
console.log(f instanceof Fn) //true
console.log(typeof 1) //numeber
重點(diǎn):結(jié)合了兩種模式的優(yōu)點(diǎn)喉刘,傳參和復(fù)用
特點(diǎn):1、可以繼承父類原型上的屬性漆弄,可以傳參睦裳,可復(fù)用。
2撼唾、每個(gè)新實(shí)例引入的構(gòu)造函數(shù)屬性是私有的廉邑。
缺點(diǎn):調(diào)用了兩次父類構(gòu)造函數(shù)(耗內(nèi)存),子類的構(gòu)造函數(shù)會代替原型上的那個(gè)父類構(gòu)造函數(shù)。
- instanceof運(yùn)算符的左邊是實(shí)例對象蛛蒙,右邊是構(gòu)造函數(shù)糙箍。它會檢查右邊構(gòu)建函數(shù)的原型對象(prototype),是否在左邊對象的原型鏈上牵祟。因此深夯,上面兩種寫法是等價(jià)的。
- instanceof運(yùn)算符只能用于對象诺苹,不適用原始類型的值咕晋。