JavaScript instanceof 原理
基本工作原理
基本语法
js
object instanceof constructor说明
object是被检测对象constructor是构造函数或者类- 它会返回一个布尔值,判断
object是不是constructor的实例,或者是否继承自constructor.prototype
实现原理
代码示例
js
function myInstanceof(obj, constructor) {
let proto = Object.getPrototypeOf(obj) // 取的是obj.__proto__
// let proto = obj.__proto__
let prototype = constructor.prototype
while(proto !== null) {
if (proto === prototype) {
return true
}
proto = Object.getPrototypeOf(proto)
// proto = proto.__proto__
}
return false
}测试
js
function People() {}
function Man() {}
Man.prototype = Object.create(People.prototype)
const man = new Man()
myInstanceof(man, Man) // true
myInstanceof(man, People) // true
myInstanceof(man, Object) // true
myInstanceof(man, Array) // false总结
两个判断点
- 是不是构造函数的实例
- 是否继承自构造函数的
prototype
拓展
obj.__proto__也可以被修改,修改之后可能影响instanceof的结果
js
const obj = { name: 'Alice' }
obj.__proto__ = Array.prototype
console.log(obj instanceof Array) // true
console.log(obj instanceof Object) // trueSymbol.hasInstance可以用来自定义instanceof的行为
js
class Dog {
static [Symbol.hasInstance](obj) {
return 'tail' in obj
}
}
const dog = { tail: 1 }
console.log(dog instanceof Dog) // truenull instanceof Object的返回值是false