zoukankan      html  css  js  c++  java
  • js之new的原理

    在调用new的过程中会发生以上四件事情:

    1.新生成了一个对象
    2.链接到原型
    3.绑定this
    4.返回新对象

    function create() {
    let obj = {} //创建一个新对象
    let Con = [].shift.call(arguments)//拿到arguments的第一项,类数组不能调用数组的方法shift
    obj.__proto__ = Con.prototype    //让新对象原型等于构造函数的原型
    let result = Con.apply(obj, arguments) //传参
    return result instanceof Object ? result : obj 
    //构造函数的return语句返回一个数值。这时,new命令就会忽略这个return语句,返回“构造”后的this对象。
    //但是,如果return语句返回的是一个跟this无关的新对象,new命令会返回这个新对象,而不是this对象。这一点需要特别引起注意。
    //普通函数(内部没有this关键字的函数)使用new命令,则会返回一个空对象。
    }
    function Person(name,age){
      this.name = name
      this.age = age
    }
    var person = new Person()
    create(person,'张三',20)
    

    以下是对实现的分析:

    创建一个空对象
    获取构造函数
    设置空对象的原型
    绑定 this 并执行构造函数
    确保返回值为对象

    通过 new 的方式创建对象和通过字面量创建有什么区别?

    对于创建一个对象来说,更推荐使用字面量的方式创建对象(无论性能上还是可读性)。因为你使用 new Object() 的方式创建对象需要通过作用域链一层层找到 Object ,但是你使用字面量的方式就没这个问题。

  • 相关阅读:
    「JXOI2018」游戏
    「CTSC2018」假面
    CodeForces
    CodeForces
    [Lydsy1710月赛] 小B的数字
    OpenJ_Bailian
    [SDOI2010] 地精部落
    CodeForces
    CodeForces
    [NOI2009] 管道取珠
  • 原文地址:https://www.cnblogs.com/lyly96720/p/12263347.html
Copyright © 2011-2022 走看看