new之后发生了什么

从实例对象的过程

  1. // 声明构造函数
  2. function Person(name) {
  3. this.name = name // 实例的属性
  4. }
  5. // 声明实例的方法
  6. Person.prototype.sayHi = function () {
  7. console.log('你好,' + this.name)
  8. }
  9. // 实例对象
  10. let obj = new Person('张三')
  11. obj.sayHi() // 你好,张三
  12. console.log(obj) // Person {name: '张三'}

从以上代码中可以看出:

  1. 从obj的值来看,new之后返回了一个对象
  2. 从obj的属性name来看,new之后会调用构造函数,并改变调用的this为obj
  3. 从sayHi方法看,返回的这个对象的proto等于构造函数的prototype
  4. prop中的constructor属性指向构造函数本身

    那可以推断出new的过程:

    1、创建一个新对象
    2、将构造函数的作用域赋值给新对象(this指向这个新对象)
    3、执行构造函数中的代码(为这个新对象添加属性)
    4、返回新对象

    手写实现一个new函数

  • 根据实例化的过程,手写实现一个new函数 ```javascript // 创建new函数 function myNew(fn, …arg) { // 创建一个对象,并让其原型等于构造函数的原型 const target = Object.create(fn.prototype) // 执行构造函数,this指向target fn.apply(target, arg) // 返回该对象 return target }

// 测试代码 // 创建构造函数 function Person(name) { this.name = name } Person.prototype.sayHi = function () { console.log(‘你好,’ + this.name) } // 实例化 let obj = myNew(Person, ‘张三’) console.log(obj) // Person {name: ‘张三’} obj.sayHi() // 你好,张三 console.log(obj instanceof Person) // true ```