Day06 - 构造函数的返回值与new实例关系 | 面试365

知识讲解

如果函数返回 return {}return nullreturn 1return true 会发生什么情况?

答案很简单,干脆先搞个代码自行实验一下

代码试验

实践出真知

console.table(
  [null, undefined, 1, true, "", Symbol(), { a: 1 }, [1, 2]]
    .map((v) => [
      v,
      function () {
        return v;
      },
    ])
    .map(([ret, MyConstructor]) => [
      Object.prototype.toString.call(ret),
      ret,
      new MyConstructor(),
    ])
);
​
复制代码

image-20220106213814585

模拟函数

function myNew(fn, ...args) {
  // 创建一个空对象
  const obj = {};
  // 将该对象的 __proto__ 属性链接到构造函数原型对象
  obj.__proto__ = fn.prototype;
  // 将该对象作为 this 上下文调用构造函数并接收返回值
  const res = fn.apply(obj, args);
  // 如果返回值存在并且是引用数据类型,返回构造函数返回值,否则返回创建的对象
  return typeof res === "object" ? res : obj;
}
const c = myNew(Person, "b");
c.say();
复制代码

结论

  • 基础类型返回空对象
  • 引用类型返回引用类型

面试攻略

  • 基础类型返回空对象
  • 引用类型返回引用类型

点评

  • 又是一个Javascript的特别的地方大家要记清。

支持然叔

关注公众号 【前端大班车】 和然叔一起打卡

猜你喜欢

转载自juejin.im/post/7050087767962976287
今日推荐