继承的三种模式
1.借用构造函数(call和apply)
作用:改变this指向,利用别人的函数,实现了自己的功能
(1)call
栗子1:
function Car (color,width,height){
this.color = color; //调用call之前这个this是window, //将引用传给obj后,这个this指向的是obj
this.width = width;
this.height = height;
}
var car = new Car('green','2000','2000')
var obj = { }
Car.call( obj, "red" , "1900", " 900" ); //第二个参数开始是给obj的属性传参
此时obj拥有属性
obj
{color: "red", width: "1900", height: " 900"}
栗子2:
function Person(name,age,sex){
this.name = name;
this.age = age;
this. sex = sex;
}
function Student (name,age,sex,classa ){
//系统默认指定了this
// var this={ Object.create(Student.prototype) }
Person.call( this,name,age,sex);
this.classa = classa;
}
var student = new Student("a",10,"男","1190");
此时student拥有4个属性
student
Student {name: "a", age: 10, sex: "男", classa: "1190"}
(2)apply
和call一样 但是传参时以数组的形式传进去,例如
Person.call( [this,[name,age,sex ] );//多加一个方括号在参数外
缺点:
call指向的引用必须完全使用父级的属性,也就是说需求完全涵盖父级的,再考虑使用,你可以在他的基础上添加,但不能减少他的原有属性。即在实际中,如果别人写了一个基础方法满足你的需求,你就用他的方法。
2.共享原型
即父类和子类都用同一个原型
Father.prototype.money=1000
function Father(){}
function Son(){}
function inherit(Target,Origin){
Target.prototype = Origin.prototype;
}
inherit(Son,Father);
var son = new Son(); //注意和上一句的次序不能变
var father = new Father();
Son.prototype.sex='male'; //此时father和son都有sex属性
缺点:父类跟子类互相影响
3.圣杯模式(继承的最佳写法)
function inherit(Target,Origin){
function F(){}
F.prototype = Origin.prototype;
Target.prototype = new F( ); //与上一行的位置不能变
Target.prototype.constructor=Target;//指定,否则会是Origin,非必要
Target.prototype.uber= Origin.prototype;//指明原型,即super,非必要
}
function Father( ){ }
function Son( ){ }
Father.prototype.name="father ";
inherit(Son,Father);
var son =new Son();
var father = new Father();
son.name; -->"father" //继承父亲的属性
son.sex="male"; //自定义自己的属性
son.sex -->"male"
father.sex -->undefined //父没有子的属性,不会受到子的影响
雅虎的写法,把继承函数写成了立即执行,其他的都一样
var inherit = (function(){
var F = function(){}
return function(Target,Origin){
F.prototype = Origin.prototype;
Target.prototype = new F();
Target.prototype.constructor = Target;
Target.prototype.uber = Origin.prototype;
}
}())
function Father(){}
function Son(){}
Father.prototype.lastName='aa';
inherit(Son,Father);
var father = new Father();var son = new Son()