最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 你不知道的JS构造函数

    正文概述 掘金(前端爱好者lkj)   2021-06-14   343

    导读

    我们通过 new Constructor() 这种形式来创建对象应该非常熟悉了,但是 new 关键字内部究竟发生了什么,你是否有探究过呢?接下来让我们一步步揭开它神秘的面纱吧。

    一、构造函数的内部原理(隐式三段论)

    假设我们写了一个这样的构造函数:function Person(){},系统则会为 Person 构造函数添加一个静态属性 prototype,该属性为一个对象,该对象有两个属性,分别为 constructor__proto__,代码如下

    function Person(){};
    //下面代码是系统自动添加的
    Person.prototype = {
      constructor: Person,//指向Person构造函数
      __proto__: Object//指向Object对象
    }
    

    然后我们通过 new 关键字来创建一个对象 person ,如 const person = new Persopn(); 时,构造函数内部会发生以下三步:

    1. 第一步:在函数体第一行系统开始添加如下代码(系统内部做的操作我们是看不见的)

      function Person(){
        // 1.第一步:系统添加如下代码
        var this = {
          __proto__ : Person.prototype,
        };
      }
      
    2. 第二步:增属性(自己手动添加的)

      function Person(){
        // 1.第一步:系统添加如下代码
        var this = {
          __proto__ : Person.prototype,
        };
        // 2.第二步:我们手动添加的代码...,如 this.age=18
      }
      
    3. 第三步:系统隐式返回 this

      function Person(){
        // 1.第一步:系统添加如下代码
        var this = {
          __proto__ : Person.prototype,
        };
        // 2.第二步:我们手动添加的代码...,如this.age=18
      
        // 3.第三步:系统添加如下代码
        return this;
      }
      

    我们把以上通过 new 关键字构建一个对象时系统内部所做的操作称为构造函数的隐式三段论

    接下来我们通过实际的例子来验证一下以上三步是否正确执行。

    示例1

    function Person(name, age){
      this.age = age;
      this.name = name;
    }
    const person = new Person("lkj", 18)
    console.log(person)
    

    控制台打印结果如下

    你不知道的JS构造函数

    示例2

    function Student(){
    
    }
    const student  = new Student();
    console.log(student); 
    

    控制台打印结果如下 你不知道的JS构造函数

    更多例子大家可以自己多去测试验证啊,这里就不再举例了。

    二、别样的礼物

    根据上面的内容我们已经了解了构造函数内部的 this 原理了。接下来,我们再进一步探讨构造函数体内我们若是显示地返回一个数据呢,构造函数是否仍然会返回 this

    1. 显示返回一个原始值

      function Test(){
        this.name = "lkj";
        this.age = 12;
        return 12;// 显示返回一个数字
      }
      const test = new Test();
      console.log(test);
      

      控制台打印结果如下

    你不知道的JS构造函数

    1. 显示返回一个对象

      function Test() {
        const obj = {
          number: 201730134057,
          sex: "male"
        }
        this.name = "lkj";
        this.age = 12;
        return obj; // 显示返回一个对象
      }
      const test = new Test();
      console.log(test); 
      

      控制台打印的结果如下

    你不知道的JS构造函数

    总结

    由上面的例子我们可知:

    • 若你在构造函数中显示返回一个对象(如普通对象函数数组等) ,那么隐式第三步(return this)就不会执行。
    • 若你在构造函数中显示返回一个原始值(如数字字符串布尔值等),那么隐式第三步(return this)仍会执行,而我们显示 return 的内容则会忽略。

    起源地下载网 » 你不知道的JS构造函数

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元