sjn_hoho

sjn_hoho

instanceof的实现原理然后展开去

instanceof 是 JavaScript 中的一个运算符,字面意思就是判断一个势力是否属于某种类型,

const Person = function(){
}
let sjn = new Person()
sjn instanceof Person //true

这个操作符的实现原理网上已有先驱整理出一段代码,我就借花献佛。

function instanceOf(left,right){
let rightProto = right.prototype
let leftValue = left.__proto__
    while(true){
        if(leftValue === null)
            return false
        if(leftValue === rightProto)
            return true
        leftValue = leftValue.__proto__
    }
}

其实这也符合 MDN 中对 instanceof 的定义:instanceof 运算符用于测试构造函数的 prototype 属性是否出现在对象的原型链中的任何位置 上述代码为什么就是这句定义呢,那么就涉及到__proto__属性。 __proto__是在 Object.prototype 上的属性,暴露了通过它访问的对象的内部[[Prototype]] 哇。这么多 proto,我都有点晕了呢。 我们来举个例子。 let str = new String("test") 那么str.__proto__指向内部属性[[Prototype]]也就是 String.prototype,是不是很简单, 但是,使用__proto__是有争议的,也不鼓励使用它。因为它从来没有被包括在 EcmaScript 语言规范中,虽然现代浏览器都实现了它,但也许会在未来的某个时间停止支持。建议使用 Object.getPrototypeOf()来替代。 另外,直接修改obj.__proto__是一种对性能影响非常严重的操作,因为会影响到所有继承来自[[Prototype]]的对象。