Javascript面向对象编程(二):构造函数的继承
Javascript对象之间"继承"的5种方法:
function Transportation(){
this.category="交通工具";
}
function Car(name){
this.name=name;
}
1. 构造函数绑定模式: 使用call或者apply方法,将父对象的构造函数绑定在子对象上。
function Car(name){
Transportation.apply(this,arguments);
this.name=name;
}
var car_A=new Car("BMW");
alert(car_A.category); //交通工具
2. prototype模式:子对象的prototype对象,指向一个父类的实例对象,那么子对象的实例,就能继承父对象了。
(1). 将Car的prototype对象指向一个Transportation的实例:
Car.prototype=new Transportation();
此行增加了Car的prototype定义,会导致car_A.constructor也会指向Transportation;
(2). 将Car的prototype.constructor指向Car(若无此行,Car的prototype.constructor指向的是Transportation):
Car.prototype.constructor=Car;
var car_A=new Car("BMW");
alert(car_A.category); //交通工具
3. 方法2的改进:直接继承prototype
父对象中,不变的属性都可以直接写入Transportation.prototype。然后我们将子对象的prototype直接继承父对象的prototype。
function Transportation(){}
Transportation.prototype.category="交通工具";
Car.prototype=Trasportation.prototype;
Car.prototype.constructor=Car;
var car_A=new Car("Audi");
alert(car_A.category); //交通工具
此种方法的优点:效率高,因为不用执行和建立Transportation的实例,节省内存;
此种方法的缺点:父对象和子对象的prototype都指向了同一个对象,那么对任意一个子对象prototype的修改,都会反应到父对象的prorotype。
如:
第二行中: Car.prototype.constructor=Car;
其实就是把Transportation.prototype对象的constructor也改掉了;
alert(Transportation.prototype.constructor); //Car
4. 利用空对象作为中介:
var F=function(){};
F.prototype=Transportation.prototype;
Car.prototype=new F();
Car.prototype.constructor=Car;
F是空对象,几乎不占内存。修改了子对象Car的prototype对象,就不会影响到父对象Transportation的prototype对象。
可以将上面的写法封装成一个函数:
function extend(Child,Parent){
var F=function(){};
F.prototype=Parent.Prototype;
Child.prototype=new F();
Child.prototype.constructor=Child;
//为子对象设一个uber属性,该属性直接指向父对象的prototype属性。
// 只是为了实现继承的完备性,纯属备用性质的一行代码。
Child.uber=parent.prototype;
}
extent(Car,Transportation);
var car_A=new Car("BMW");
alert(car_A.category); //交通工具
5. 拷贝继承:把父对象的所有属性和方法,拷贝进子对象。
function Transportation(){}
Transportation.prototype.category="交通工具";
function copyAll(Child,Parent){
var p=Parent.prototype;
var c=Child.prorotype;
for(var i in p){
c[i]=p[i];
}
c.uber=p;
}
使用时:
copyAll(Car,Transportation);
var car_A=new Car("BMW");
alert(car_A.category); //交通工具
浙公网安备 33010602011771号