js中的(混合对象)类

显式混入

js手动实现类的复制功能

function mixin(fatherObj, childObj) {
    for (var key in fatherObj) {
        if (!(key in childObj)) {
            childObj[key] = fatherObj[key]
        }
    }

    return childObj
}   //复制方法,已有的key不复制

var food = {  //创建父类
    caneat: true,

    tasty: function () {
        console.log("its delicious")
    }
}

var egg = mixin(food, {    //从父类拷贝到子类
    price: function () {
        console.log("very cheap")
    }
})

console.log(egg)  
// {caneat: true, price: ƒ, tasty: ƒ}

寄生继承

// 传统类
function Vehicle() {
    this.engines = 1
}

Vehicle.prototype.ignition = function () {
    console.log("启动引擎")
}

Vehicle.prototype.drive = function () {
    this.ignition()
    console.log("开起走")
}

function Car() {
    //现定义car是一个Vehicle
    var car = new Vehicle()

    //对car进行特殊定制
    car.wheels = 4

    //保存父类的drive到h
    var h = car.drive

    car.drive = function () {
        h.call(this)
        console.log("老实踩油门,拱起走")
    }

    return car
}

var polo = new Car()

polo.drive()  
//启动引擎
//开起走
//老实踩油门,拱起走

以上例子,现复制父类Vehicle的定义,然后再混入子类的定义(如果需要保留到父类的特殊引用),然后用这个复合对象构建实例

注意:这里调用new Car时会创建一个新对象并绑定到Car的this上,但是因为我们没有使用这个对象,而是返回了我们自己的car对象,所以最初创建的这个对象会被丢弃,因此可以不使用new关键字调用Car(),这样做的结果是一样的,但是可以避免创建并丢弃多余的对象

你可能感兴趣的:(js中的(混合对象)类)