js中的(混合對(duì)象)類(lèi)

顯式混入

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ì)象

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容