前言

此文通过重写的方式整理 new 的具体实现

new 原理

new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例

new 使用

  1. // 没有 return 语句
  2. // 返回基于 Person.prototype 的新对象
  3. function Person(age) {
  4. this.age = age;
  5. }
  6. var person = new Person(18);
  7. console.log(person); // Person {age: 18}
  8. // return 对象
  9. // 返回 return 后面的对象
  10. function Person(age) {
  11. this.age = age;
  12. return { name: '手动返回一个对象' }
  13. }
  14. var person = new Person(18);
  15. console.log(person); // {name: "手动返回一个对象"}
  16. // return 基本数据类型
  17. // 返回基于 Person.prototype 的新对象
  18. function Person(age) {
  19. this.age = age;
  20. return 1
  21. }
  22. var person = new Person(18);
  23. console.log(person); // Person {age: 18}

new 原理

  1. 创建一个空的简单 JavaScript 对象
  2. 链接这个对象到 new 后面的构造函数的对象原型
  3. 以新创建的对象会基础对象执行构造函数中的代码,类似 apply 的操作
  4. 如果该函数没有返回对象,则返回 this

new 模拟

  1. function objectFactory(...params) {
  2. // 创建基本对象
  3. const newObj = {}
  4. // 获取构造函数
  5. const constructorFun = params.shift()
  6. // obj 的隐式原型指向构造函数的原型
  7. obj.__proto__ = constructorFun.prototype
  8. // 基于新建的对象,执行构造函数
  9. const result = constructorFun.apply(obj, params)
  10. // 如果构造函数的返回结果是 object 类型 那么返回这个结果
  11. if(typeof result === 'object'){
  12. return result
  13. }
  14. // 否则返回新建的对象
  15. return newObj
  16. }