js new做了什么,怎么去仿写new

// 假设你在学习之前了解 js面向对象

  function Student(name){
    this.name = name;
  }
  
  const stu = new Student("Tom");
  
  // 当我们通过构造函数 new 一个实例时都做了什么?
  1. 创建一个新对象
  2. 将新对象的 __proto__ 指向构造函数的 prototype //(所以实例可以使用构造函数上的属性和方法)
  3. 将构造函数的 this 指向这个新对象
  4. 返回新对象
  
  // 所以根据四个步骤我们可以仿写一个 new 
  function _new(fn, ...props){
    // 创建一个新对象
    const obj = {}; 
    // 将新对象的 __proto__ 指向构造函数的 prototype
    Object.setPrototypeOf(obj, fn.prototype); // 相当于 obj.__proto__ = fn.prototype, 但是不建议直接使用__proto__
    // 将构造函数的 this 指向这个新对象
    const newObj = fn.apply(obj, props);
    // 返回这个新对象
    return newObj === 'object' ? newObj : obj
  }
  
  const stu1 = _new(Student, "Tom")
  // 可以打印一下 stu 和 stu1 效果一样, 而且 Object.getPrototypeOf(stu) === Object.getPrototypeOf(stu1) 为 true; 
  // Object.getPrototypeOf(stu) 相当于 stu.__ptoto__
  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值