顯式混入
js手動(dòng)實(shí)現(xiàn)類(lèi)的復(fù)制功能
function mixin(fatherObj, childObj) {
for (var key in fatherObj) {
if (!(key in childObj)) {
childObj[key] = fatherObj[key]
}
}
return childObj
} //復(fù)制方法,已有的key不復(fù)制
var food = { //創(chuàng)建父類(lèi)
caneat: true,
tasty: function () {
console.log("its delicious")
}
}
var egg = mixin(food, { //從父類(lèi)拷貝到子類(lèi)
price: function () {
console.log("very cheap")
}
})
console.log(egg)
// {caneat: true, price: ?, tasty: ?}
寄生繼承
// 傳統(tǒng)類(lèi)
function Vehicle() {
this.engines = 1
}
Vehicle.prototype.ignition = function () {
console.log("啟動(dòng)引擎")
}
Vehicle.prototype.drive = function () {
this.ignition()
console.log("開(kāi)起走")
}
function Car() {
//現(xiàn)定義car是一個(gè)Vehicle
var car = new Vehicle()
//對(duì)car進(jìn)行特殊定制
car.wheels = 4
//保存父類(lèi)的drive到h
var h = car.drive
car.drive = function () {
h.call(this)
console.log("老實(shí)踩油門(mén),拱起走")
}
return car
}
var polo = new Car()
polo.drive()
//啟動(dòng)引擎
//開(kāi)起走
//老實(shí)踩油門(mén),拱起走
以上例子,現(xiàn)復(fù)制父類(lèi)Vehicle的定義,然后再混入子類(lèi)的定義(如果需要保留到父類(lèi)的特殊引用),然后用這個(gè)復(fù)合對(duì)象構(gòu)建實(shí)例
注意:這里調(diào)用new Car時(shí)會(huì)創(chuàng)建一個(gè)新對(duì)象并綁定到Car的this上,但是因?yàn)槲覀儧](méi)有使用這個(gè)對(duì)象,而是返回了我們自己的car對(duì)象,所以最初創(chuàng)建的這個(gè)對(duì)象會(huì)被丟棄,因此可以不使用new關(guān)鍵字調(diào)用Car(),這樣做的結(jié)果是一樣的,但是可以避免創(chuàng)建并丟棄多余的對(duì)象