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]]的对象。