关于 new 和 instanceof 的原理

149 阅读1分钟

1、new

在 JavaScript 中,当我们调用 new 的过程中会发生四件事情

  • 新生成一个对象
  • 链接到原型
  • 绑定 this
  • 返回新对象

以上几个过程,我们可以试着来自己实现一个 new

function create() {
  let obj = {};
  let Con = [].shift.call(arguments);
  obj.__proto__ = Con.prototype;
  let result = Con.apply(obj, arguments);
  return result = instanceof Object ? result : obj
};

以下是实现的分析:

  • 创建一个空对象
  • 获取构造函数
  • 设置空对象的原型
  • 绑定 this 并执行构造函数
  • 确保返回值为对象

对于对象来说,其实是通过 new 产生的,无论是 function Foo() 还是 let a = { b: 1 } 。

对于创建一个对象来说,更推线使用字面量的方式创建对象(无论性能上还是可读性)。因为使用 new obj() 的方式创建对象需要通过作用域链一层层找到 Object,但是使用字面量的方式就没这个问题。

function Foo() {};
// function 就是一个语法糖,内部等于 new Function()
let a = { b : 1};
// 这个字面量内部也是使用了 new Object()

2、instanceof

在 JavaScript 中,instanceof 可以正确判断对象的类型,因为内部机制是通过判断对象的原型链中是否能找到类型的 prototype。

我们可以尝试实现一下 instanceof:

function MyInstanceof(left, right) {
  let prototype = right.prototype;
  left = left.__proto__;
  while (true) {
    if (left === null || left === undefined)
    return false
    if (prototype === left)
    return true
    left = left.prototype
  }
};

以下是实现的分析:

  • 首先获取类型的原型

  • 然后获取对象的原型

  • 最后一直循环判断对象的类型是否等于类型的原型,知道对象原型为 null,因为原型链最终为 null

---END---