new&instanceof原理解析及模拟实现

模拟实现new

需知足:bash

  1. 绑定this
  2. 新建一个对象
  3. 将对象连接到原型
  4. 返回新的对象
/**
    * 由于new是关键字,因此不能直接覆盖。
    * 咱们这边用create来模拟实现。
    */

    function create () {
    let obj = {}
    let Con = [].shift.call(arguments)
    // 连接原型,使得新建对象能够访问到构造函数原型上的属性
    obj.__proto__ = Con.prototype
    // 绑定this
    Con.apply(obj, arguments)
    return obj
    }
复制代码

构造函数返回值有以下三种状况:app

  • 一、有 return ,返回一个对象,实例只能访问返回对象中的实例
  • 二、没有 return ,即返回 undefined,实例只能访问到构造函数中的属性,和状况1彻底相反。
  • 三、返回 undefined 之外的基本类型,等于没有返回,实例只能访问到构造函数中的属性,和状况1彻底相反。

综上,因此须要判断下返回的值是否是一个对象,若是是对象则返回这个对象,否则返回新建立的 obj对象。函数

/**
    * 由于new是关键字,因此不能直接覆盖。
    * 咱们这边用create来模拟实现。
    */

    function create () {
    let obj = {}
    let Con = [].shift.call(arguments)
    // 连接原型,使得新建对象能够访问到构造函数原型上的属性
    obj.__proto__ = Con.prototype
    // 绑定this
    let ret = Con.apply(obj, arguments)
    return ret instanceof Object ? ret : obj
    }
复制代码
// 测试用例
    function Car(color) {
        this.color = color;
    }
    Car.prototype.start = function() {
        console.log(this.color + " car start");
    }

    var car = create(Car, "black");
    car.color;
    // black

    car.start();
    // black car start
复制代码

模拟实现instanceof

instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上。测试

function instanceof1 (left, right) {
        // 获取类型原型
        let prototype = right.prototype
        // 获取对象原型
        left = left.__proto__
        // 判断对象的类型是否等于类型的原型
        while (true) {
            if (left === null)
                return false
            if (left === prototype)
                return true
            left = left.__proto__
        }
    }
复制代码

收工~ui

相关文章
相关标签/搜索