面试-js实现 手写new实例过程

1.new的使用 

function Person(name, age){
  this.name = name;
  this.age = age;
}
let person = new Person("halou", 18);
console.log(person); // Person {name: "halou", age: 18}

2.手写new

function new2(fn, ...args) {
  // 1. 判断是否是函数
  if (typeof fn !== 'function') {
    throw '第一个参数必须是函数';
  }
  // 2. 创建新对象
  const obj = {};
  // 3. 这个对象的 __proto__ 指向 fn 这个类的原型对象
  // 即实例可以访问构造函数原型(constructor.prototype)所在原型链上的属性
  obj.__proto__ = fn.prototype;
  // 4. 通过 apply 绑定 this 执行并且获取运行后的结果
  let res = fn.apply(obj, args);
  // 5. 如果构造函数返回的结果是引用数据类型,则返回运行后的结果
  // 否则返回新创建的 obj
  const isObject = typeof res === 'object' && typeof res !== null;
  const isFunction = typeof res === 'function';

  return isObject || isFunction ? res : obj;
}

总结:

  1. 创建一个空对象
  2. 设置对象的原型链指向
  3. 设置构造函数this 指向对象,执行构造函数
  4. 判断函数的返回值类型,如果是引用类型,就返回这个引用类型的对象,否则返回创建的对象。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值