显式混入
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(),这样做的结果是一样的,但是可以避免创建并丢弃多余的对象
网友评论