zoukankan      html  css  js  c++  java
  • 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复制下来的属性副本一样。

  • 相关阅读:
    JS 数组排序
    曾经跳过的坑------replace、替换斜杠反斜杠、时间格式化处理
    List排序、集合排序
    git远程覆盖本地的
    整理日期,整理时间段,将日期集合整理为时间段
    当数据库查询in使用超过1000个的处理方式,in超过1000的问题
    oracle一些语法
    idea中git操作
    idea鼠标放上去查看注释,idea查看注释
    idea更新git远程代码,查看代码改动了哪些
  • 原文地址:https://www.cnblogs.com/linweinb/p/8268995.html
Copyright © 2011-2022 走看看