• JavaScript中借用构造函数(Constructor Stealing)继承所发现的东西


    之前在Nicholas C.Zakas的书里见过一种叫Constructor Stealing的继承方式,这种方式可以由子类型向父类型传递参数,它的实现方式如下:

    // 父类构造函数
    function SuperType(name){
         this.name=name;
    }
    
    
    // 子类构造函数
    function SubType(name){
          SuperType.apply(this,[name]);
    }
    
    
    // 子类向父类传递参数
    var instance=new SubType("linwei");
    
    
    // 此时instance自身有了name属性
    console.log(instance.hasOwnProperty("name"));   // true
    
    console.log(instance.name);                                // linwei

    于是instance被绑定到SuperType上,于是instance复制了SuperType里的属性name,于是自身就有了name属性。

    于是我疑心apply真可以为对象添加属性,便八卦心起,自己实验了一下

    function Person(name){
         this.name=name;
    }
    
    // 创建一个没有属性的对象
    var obj={};
      
    // 将obj绑定到Person上
    Person.apply(obj,["linwei"]);
    
    console.log(obj.hasOwnProperty("name"));   // true
    
    console.log(obj.name);                               //linwei

    你看,obj就有了自己的属性name。

    于是,我就想以后要创建相同类型的对象可以这样:

    function Person(name,age){
         this.name=name;
         this.age=age;
    }
    
     
    // 创建多个相同类型的对象
    var obj1={},
          obj2={},
          obj3={};
    
    // 用上述方式为每个对象添加属性
    Person.apply(obj1,["linwei",20]);
    Person.apply(obj2,["Nicholas",29]);
    Person.apply(obj3,["David",45]);

    于是每个对象都有自身的相应属性。

    类似的作用不仅有apply/call绑定,我们平时所见new调用也是一样,还有这种情况也出现在"隐式绑定":

    function Person(){
        this.name="linwei";
    }
    
    var obj={
         Person:Person
    };
    
    
    obj.Person();
    
    console.log(obj.hasOwnProperty("name"));    // true
    
    console.log(obj.name);         // linwei

    obj也有了自己的属性name,就好像从Person复制下来的属性副本一样。

  • 相关阅读:
    uboot配置和编译过程详解
    gcc 与 g++的区别
    ARM交叉编译器GNUEABI、NONE-EABI、ARM-EABI、GNUEABIHF等的区别
    SPI UART区别是什么
    C#获取时间戳的封装方法函数+使用获取当前时间时间戳
    C#中Timer定时器的使用示例
    Linux查看文件夹大小
    Python对象的创建和赋值
    使用mutt自动发送邮件
    pyTorch安装
  • 原文地址:https://www.cnblogs.com/linweinb/p/8268995.html
Copyright © 2020-2023  润新知