浅析JavaScript中的混合对象“类”
这里浅析的是《你不知道的JavaScript 上卷》中的混合对象“类”
类就是一个解决问题的蓝图,实例化类就是把蓝图构建出来。
构造函数:类中均会有一个构造函数,构造函数的作用就是,当实例化类时,会调用这个函数,可以理解为类的入口。
类的继承:即子类会继承父类的行为。
多态:即类继承之后的引用,会根据类的实例化来决定,就是当父类和子类定义相同的方法时,对于方法的使用取决于实例的类是哪个。多态并非是子类和父类有关联,而是子类得到了父类的副本,即类的继承就是复制。
多重继承:子类可以继承多个父类。
JavaScript中只有对象,并不存在实例化类。
显示混入:即是直接显示的进行对象复制。
//相当于实现实例化类的函数,实际上就是一种复制
function mixin(sourceObj, targetObj) {
for (var key in sourceObj) {
//对不存在的情况进行复制
if (!key in targetObj) {
targetObj[key] = sourceObj[key];
}
}
return targetObj;
};
var Vehicle = {
engines: 1,
ignition: function () {
console.log('Turning on my engine.');
},
drive: function () {
this.ignition();
console.log('Steering and moving forward!');
}
};
var Car = mixin(Vehicle, {
wheels: 4,
drive: function () {
Vehicle.drive.call(this);
console.log('Rolling on all' + this.wheels + 'Wheels!')
}
})
混合复制:即先把父类复制进一个空对象A内从而得到子类(对象B),再把新内容传入子类(对象B)
寄生继承:即直接在函数中new父类得到对象A,然后对A进行重写并返回。
隐式混入:利用显示的this指向,将this指向到子类的上下文。
var something = {
cool: function () {
this.greeting = 'Hello World!';
this.count = this.count ? this.count + 1 : 1;
}
};
something.coll();
something.greeting;//Hello World!
something.count;//1
var Another = {
cool: function () {
// 隐式将this指向Another,这里cool的this是Another,即显示将something.cool的this指向了Another
something.cool.call(this);
}
}
Another.cool();
Another.greeting;//Hello World!
Another.count;//1(非共享的something)