zoukankan      html  css  js  c++  java
  • 继承

    //继承,通过原型链实现
    
    function Box() {
        this.name = 'hg';
    };
    //被继承的函数叫超类型,其他语言中叫父类,基类.
    
    function Desk() {
        this.age = 100;
    };
    //继承的函数叫子类或者派生类.
    
    //通过原型链继承,超类型实例化后的对象,赋值给子类的原型属性
    //new Box()会将Box构造里的信息和原型里的信息都交给Desk
    //Desk的原型得到了Box的构造和原型信息
    Desk.prototype = new Box();
    
    var desk = new Desk();
    alert(desk.name);
    alert(desk.age);
    //继承,通过原型链实现
    function Box() {
        // this.name = 'hg';
    };
    //被继承的函数叫超类型,其他语言中叫父类,基类.
    
    Box.prototype.name = 'jack';    //就近原则,实例没有就找原型
    
    function Desk() {
        this.age = 100;
    };
    //继承的函数叫子类或者派生类.
    
    //通过原型链继承,超类型实例化后的对象,赋值给子类的原型属性
    //new Box()会将Box构造里的信息和原型里的信息都交给Desk
    Desk.prototype = new Box();
    
    var desk = new Desk();
    alert(desk instanceof Desk);        //true
    alert(desk instanceof Box);            //true
    
    
    
    使用对象冒充继承
    为了解决引用共享和超类型无法传参的问题,我们采用一种叫借用构造函数的技术,或者成为对象冒充(伪造对象、经典继承)的技术来解决这两种问题。
    function Box(age)
    {
        this.name = ['hg', 'wj'];
        this.age = age;
    };
    
    function Desk(age)
    {
        Box.call(this, age);    //对象冒充,给超类型传参
    };
    
    var desk = new Desk(100);
    alert(desk.name);            //打印成功
    
    缺点:这个无法调用Box声明的原型函数.
    组合继承
    借用构造函数虽然解决了刚才两种问题,但没有原型,复用则无从谈起。所以,我们需要原型链+借用构造函数的模式,这种模式成为组合继承。
    function Box(age)
    {
        this.name = ['hg', 'wj'];
        this.age = age;
    };
    
    Box.prototype.run = function () {
        return this.name + this.age + " runing...";
    };
    
    function Desk(age)
    {
        Box.call(this, age);            //对象冒充,给超类型传参
    };
    Desk.prototype = new Box();        //原型链继承
    
    var desk = new Desk(100);
    alert(desk.run());
    
    
    临时中转函数
    function obj(o) {        //o表示传入的对象
        function F() {};    //F构造一个临时新建的对象,用来存储传入的对象
        F.prototype = o;    //将o对象实例赋值给F构造的原型对象
        return new F();    //返回对象实例
    }
    //F.prototype = o 其实就是var box = new Box();
    
    var box = {
        name:'lee',
        age:100,
        family:[1,2,3],
    };
    
    var box1 = new obj(box);
    box1.family.push(4);
    var box2 = new obj(box);
    alert(box2.family);        //这里共享了引用类型的属性 1,2,3,4
    
    //寄生式继承 = 原型+工厂
    
    寄生组合式集成(解决调用了两次),最终的继承
    function obj(o) {
        function F() {}
        F.prototype = o;
        return new F();
    }
    
    function create(box, desk) {
        var f = obj(box.prototype);
        f.constructor = desk;    //调整原型指针
        desk.prototype = f;
    }
    
    function Box(age)
    {
        this.name = ['hg', 'wj'];
        this.age = age;
    };
    
    Box.prototype.run = function () {
        return this.name + this.age + " runing...";
    };
    
    function Desk(age)
    {
        Box.call(this, age);    //对象冒充,给超类型传参
    };
    
    create(Box, Desk);             //通过这里实现继承
    
    
    var desk = new Desk(100);
    alert(desk.run());
  • 相关阅读:
    Android Permission 访问权限大全(转)
    .NET中DateTime.Now.ToString的格式化字符串
    linux
    code only
    常用JavaScript操作页面元素的方法
    C#将字符串数组转换为以逗号分隔的字符串
    C#去除数组空格
    追源索骥:透过源码看懂Flink核心框架的执行流程
    高并发请求的缓存设计策略
    spark 2.3 导致driver OOM的一个SparkPlanGraphWrapper源码的bug
  • 原文地址:https://www.cnblogs.com/hgonlywj/p/4842614.html
Copyright © 2011-2022 走看看