手写 new 关键字和 instanceOf

79 阅读2分钟

new 关键字

在了解 new 关键字时我们要先知道 new 是拿来干什么的, new 关键字用来创建一个对象, 他后面的函数称为构造函数, 并约定首字母大写, 在创建对象的时候真正起作用的是 new 关键字, 并不是后面的函数, 后面的函数就是一个普通的函数。

new 做了什么:

  1. 创建一个空对象
  2. 给这个对象绑定一个隐式属性 [[proto]] , 这个属性指向原型对象
  3. 将 this 指向这个空对象
  4. 执行函数
  5. 返回引用

注意:如果返回值是基本数据类型, 那么 this 就执向这个创建的实例, 但是如果返回的是其他引用数据类型,那么实例指向这个引用数据

function myNew (fn, ...args) {
     // 创建一个新的对象
     const emptyObj = Object.create(null)
     // 给这个对象绑定一个隐式属性 __proto__ 指向构造函数的显示原型
     emptyObj.__proto__ = fn.prototype
     // 将 this 指向这个空对象
     this = emptyObj
     // 执行函数
     fn.apply(this, ...args)
     // 返回引用
     return this 
}

以上是对 new 的一个简单实现, 主要目的是为了搞清楚他是怎么运转的

instanceOf

instanceOf 的作用是判断表达式左边的参数是否在表达式右边的原型链上, 他是按照原型链的查找机制进行查找的, 我们知道原型链的本质就是对象的隐式原型和显示原型的连接关系, 我们沿着原型链查找就可以得到答案

    function myInstanceOf (leftParams, rightParams) {
        // 拿到左边参数的隐式原型
       let proto = leftParams.__proto__
       // 当 proto 不为空的时候, 对他进行遍历
       while (proto !== null) {
           if (proto === rightParams.prototype) {
               return true
           }
          // 这里有个知识点 obj.__proto__ === Object.prototype, Object.prototype.__proto__ === null
           proto = proro.__proto__ // 这一步是, 如果不满足条件,就让他一步一步往上查找
       }
       return false   
    }