js继承

258 阅读1分钟

1.传统形式-->原型链

  • 过多的继承了多用的属性

2.借用构造函数

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.共享原型

Father.prototype.lastName="du";
function Father(){
    
}
function Son(){
    
}
function inherit(Target,Origin){
    Target.prototype=Origin.prototype;//Son和Father的原型会指向同一个,会相互影响
}
inherit(Son,Father);
var son=new Son;//顺序不能变动
  • 不能随便改动自己的模型,原型指向一样,会互相影响。

4.圣杯模式

function inherit(Target,Origin){
    function F(){};//利用F作为一个中间层Son既可以改变自己的原型,又不会影响Father的原型
    F.prototype=Origin.prototype;
    Target.prototype=new F();
    Target.prototype.constructor=Target;//将Target的构造函数指向自己,否则会指向Origin
    Target.prototype.uber=Origin.prototype;//uber类似于一个super,快速的帮你找到直接的原型
}
Father.prototype.lastName="du";
function Father(){
    
}
function Son(){
    
}
inherit(Son,Father);
var son=new Son();
var father=new Father();

//类似功能另外一种写法
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;    
    }
}());//形成了一个闭包