实现继承的各种方法:
1、传统形式–>原型链
缺点:过多的继承了没用的属性
2、借用构造函数 -->利用call、apply(不算标准的继承模式)
缺点:
- 不能继承借用构造函数的原型
- 每次构造函数都要多走一个函数 -->浪费效率
function Person(name,age,sex){
this.name=name;
this.age=age;
this.sex=sex;
}
function Student(name,age,sex,grade){
Person.call(this,name,age,sex);
this.grade=grade;
}
var student=new Student();
3、共享原型(较好的一个继承方法)
缺点:不能随意改动自己的原型,改动son的属性,会影响到father的属性
Father.prototype.name = 'zhang';
function Father() {
}
function Son() {
}
Son.prototype = Father.prototype;//共享原型
var son = new Son();
var father = new Father();
先继承后使用
4、圣杯模式
在共享原型的基础上再加一个构造函数function F(){}当做中间层,然后让F和Father有一个共享原型F.prototype = Father.prototype,然后Son.prototype=new F();使用原型链形成了继承关系,现在改Son.prototype ,不会影响Father.prototype
封装一个继承函数inherit:
function inherit(Target, Origin) {
function F() {};
F.prototype = Origin.prototype;
Target.prototype = new F();
}
function Father() {
}
function Son() {
}
inherit(Son, Father);
var son = new Son();
var father = new Father();
son.proto–>new F().proto–>Father.prototype
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;//超类
}
}());
上面的var F的这个F让其形成了闭包,成为了这个函数的私有化变量。