• JavaScript对象 继承


    JavaScript继承主要依靠原型链实现。

    原型链

    利用原型让一个引用类型继承另一个引用类型水位属性和方法。

    每一个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。

                        
            function SuperType(){
                this.property = true;
            }
            
            SuperType.prototype.getSuperValue = function(){
                return this.property;
            };
            
            function SubType(){
                this.subproperty = false;
            }
            
            //inherit from SuperType
            SubType.prototype = new SuperType();
            
            //new method
            SubType.prototype.getSubValue = function (){
                return this.subproperty;
            };
            
            //override existing method
            SubType.prototype.getSuperValue = function (){
                return false;
            };
            
            var instance = new SubType();
            alert(instance.getSuperValue());   //false

    原型链的问题:1 原型对象包含引用类型值得属性;2 不能向超类型的构造函数中传递参数。

    使用构造函数

    在子类型的构造函数的内部调用超类型的构造函数。

            function Person(name, age, job){
                this.name = name;
                this.age = age;
                this.job = job;
                this.sayName = function(){
                    alert(this.name);
                };
            }
            
            var person = new Person("Nicholas", 29, "Software Engineer");
            person.sayName();   //"Nicholas"
            
            Person("Greg", 27, "Doctor");  //adds to window
            window.sayName();   //"Greg"
            
            var o = new Object();
            Person.call(o, "Kristen", 25, "Nurse");
            o.sayName();    //"Kristen"

    使用构造函数的问题:方法都要在构造函数中定义。

    组合继承

    使用原型链和构造函数组合

            function SuperType(name){
                this.name = name;
                this.colors = ["red", "blue", "green"];
            }
            
            SuperType.prototype.sayName = function(){
                alert(this.name);
            };
    
            function SubType(name, age){  
                SuperType.call(this, name);
                
                this.age = age;
            }
    
            SubType.prototype = new SuperType();        
            SubType.prototype.constructor = SubType; 
    SubType.prototype.sayAge
    = function(){ alert(this.age); }; var instance1 = new SubType("Nicholas", 29); instance1.colors.push("black"); alert(instance1.colors); //"red,blue,green,black" instance1.sayName(); //"Nicholas"; instance1.sayAge(); //29 var instance2 = new SubType("Greg", 27); alert(instance2.colors); //"red,blue,green" instance2.sayName(); //"Greg"; instance2.sayAge(); //27

     寄生组合式继承   

    在组合继承中,会两次调用超类型的构造函数(第1是在SubType.prototype = new SuperType();第2是在SuperType.call(this, name);),会生成两组属性,一组在实例上,一组在原型中。

    寄生组合式继承是实现基于类型继承最有效的方式

            function object(o){
                function F(){}
                F.prototype = o;
                return new F();
            }
        
            function inheritPrototype(subType, superType){
                var prototype = object(superType.prototype);   //create object
                prototype.constructor = subType;               //augment object
                subType.prototype = prototype;                 //assign object
            }
                                    
            function SuperType(name){
                this.name = name;
                this.colors = ["red", "blue", "green"];
            }
            
            SuperType.prototype.sayName = function(){
                alert(this.name);
            };
    
            function SubType(name, age){  
                SuperType.call(this, name);
                
                this.age = age;
            }
    
            inheritPrototype(SubType, SuperType);
            
            SubType.prototype.sayAge = function(){
                alert(this.age);
            };
            
            var instance1 = new SubType("Nicholas", 29);
            instance1.colors.push("black");
            alert(instance1.colors);  //"red,blue,green,black"
            instance1.sayName();      //"Nicholas";
            instance1.sayAge();       //29
            
           
            var instance2 = new SubType("Greg", 27);
            alert(instance2.colors);  //"red,blue,green"
            instance2.sayName();      //"Greg";
            instance2.sayAge();       //27

    --以上内容来自JavaScript高级程序设计

  • 相关阅读:
    创建型设计模式-原型模式(单例) MemberwiseClone()
    Oracle 查看没有释放的链接 和删除,相关sql
    win10 安装 SQL Developer 工具
    修改nuget包默认存放路径 win10
    使用端口查询
    未能加载文件或程序集“Newtonsoft.Json, Version=12.0.0.0,
    微信错误码
    sqlserver 时间转换记录
    Homebrew 使用指南
    在Mac检查安装的.net core 版本
  • 原文地址:https://www.cnblogs.com/YuanSong/p/3899058.html
Copyright © 2020-2023  润新知