• 《Javascript高级程序设计》读书笔记之继承


    1.原型链继承

    让构造函数的原型对象等于另一个类型的实例,利用原型让一个引用类型继承另一个引用类型的属性和方法

    function SuperType()
    {
        this.property=true;
    }
    SuperType.prototype.getSuperValue=function(){
        return this.property;
    };
    function SubType()
    {
        this.subProperty=false;
    }
    //继承SuperType
    SubType.prototype=new SuperType();
    SubType.prototype.getSubValue=function(){
        return this.subProperty;
    }
    
    var instance=new SubType();
    alert(instance.getSuperValue());//true
    View Code

    代码示例中,完整原型链如下

    原型链继承的问题:父类型引用类型的属性会被所有子类型实例共享,这是不符合预期的

    function SuperType()
    {
        this.colors=["red","blue","green"];
    }
    
    function SubType()
    {
    }
    //继承SuperType
    SubType.prototype=new SuperType();
    
    var instance1=new SubType();
    instance1.colors.push("black");
    alert(instance1.colors);//"red","blue","green","black"
    
    var instance2=new SubType();
    alert(instance2.colors);//"red","blue","green","black"
    View Code

    2.借用构造函数继承

    基本思想是在子类型构造函数内部调用超类型构造函数

    function SuperType()
    {
        this.colors=["red","blue","green"];
    }
    
    function SubType()
    {
        //继承SuperType
        SuperType.call(this);
    }
    
    var instance1=new SubType();
    instance1.colors.push("black");
    alert(instance1.colors);//"red","blue","green","black"
    
    var instance2=new SubType();
    alert(instance2.colors);//"red","blue","green"
    View Code

    借用构造函数可以像超类型构造函数传递参数

    function SuperType(name)
    {
        this.name=name;
    }
    
    function SubType()
    {
        //继承SuperType
        SuperType.call(this,"Jim");
        this.age=28;
    }
    
    var instance1=new SubType();
    alert(instance1.name);//"Jim"
    alert(instance1.age);//28
    View Code

    借用构造函数的问题:不能复用超类型的方法

    3.组合继承

    使用原型链实现对原型属性和方法的继承,通过借用构造函数实现对实例属性的继承

    function SuperType(name)
    {
        this.name=name;
        this.colors=["red","blue","green"];
    }
    SuperType.prototype.sayName=function(){
        alert(this.name);
    };
    function SubType(name,age)
    {
        //继承SuperType
        SuperType.call(this,name);
        this.age=age;
    }
    SubType.prototype=new SuperType();
    SubType.prototype.sayAge=function(){
        alert(this.age);
    }
    var instance1=new SubType("Jim",29);
    instance1.colors.push("black");
    alert(instance1.colors);//"red","blue","green","black"
    instance1.sayName();//"Jim"
    instance1.sayAge();//29
    
    var instance2=new SubType("Jack",28);
    alert(instance2.colors);//"red","blue","green"
    instance2.sayName();//"Jack"
    instance2.sayAge();//28
    View Code

    4.寄生组合式继承

    寄生组合式继承,解决了组合继承中,两次调用超类型构造函数的问题

    function object(o)
    {
        function F(){}
        F.prototype=o;
        return new F();
    }
    function inheritPrototype(subType,superType)
    {
        var prototype =object(superType.prototype);
        prototype.constructor=superType;//原书是prototype.constructor=subType,看书时认为这里应该是superType
        subType.prototype=prototype;
    }
    function SuperType(name)
    {
        this.name=name;
        this.colors=["red","blue","green"];
    }
    SuperType.prototype.sayName=function(){
        alert(this.name);
    };
    function SubType(name,age)
    {
        //继承SuperType
        SuperType.call(this,name);
        this.age=age;
    }
    inheritPrototype(SubType,SuperType);
    SubType.prototype.sayAge=function(){
        alert(this.age);
    }
    var instance1=new SubType("Jim",29);
    instance1.colors.push("black");
    alert(instance1.colors);//"red","blue","green","black"
    instance1.sayName();//"Jim"
    instance1.sayAge();//29
    
    var instance2=new SubType("Jack",28);
    alert(instance2.colors);//"red","blue","green"
    instance2.sayName();//"Jack"
    instance2.sayAge();//28
    View Code
  • 相关阅读:
    Support依赖库大全
    反射调用泛型
    会爬行的小乌龟
    改进版——使用了双缓冲技术
    启动运行发现窗体不能最大化,添加
    添加图层
    实现放大,缩小,漫游,复位等功能
    从上一个项目中我得到的反思
    ​Error -4075: File not found. An error occurred merging module <MODULENAME> for feature <FEATURENAME>.
    总结—angularjs项目
  • 原文地址:https://www.cnblogs.com/GongQi/p/4029678.html
Copyright © 2020-2023  润新知