instanceof
的基本语法object instanceof constructor
object
是要进行检查的对象。constructor
是构造函数,用来检测 object
是否是其实例。instanceof
的工作原理instanceof
的核心机制是基于原型链的检查。它的工作原理如下:
获取构造函数的 prototype
:首先,instanceof
操作符会从构造函数中获取 prototype
属性,这就是构造函数的原型对象。
沿原型链查找:然后,instanceof
会检查对象的原型链,看是否存在构造函数的原型对象。如果找到匹配的原型对象,则返回 true
;如果遍历到 Object.prototype
仍然没有找到,则返回 false
。
原型链的终点:如果对象的原型链上存在构造函数的 prototype
对象,表示对象是构造函数的实例,返回 true
。否则,返回 false
。
function Animal() {}
function Dog() {}
Dog.prototype = Object.create(Animal.prototype);
const myDog = new Dog();
console.log(myDog instanceof Dog); // true
console.log(myDog instanceof Animal); // true
console.log(myDog instanceof Object); // true
console.log(myDog instanceof Array); // false
在这个示例中:
myDog instanceof Dog
返回 true
,因为 myDog
是 Dog
的实例。myDog instanceof Animal
返回 true
,因为 Dog
的原型继承自 Animal
的原型。myDog instanceof Object
返回 true
,因为 Object
是所有对象的原型链的终点。myDog instanceof Array
返回 false
,因为 myDog
的原型链上没有 Array
的原型对象。instanceof
的实现如果要实现 instanceof
的逻辑,可以通过以下步骤:
Object.prototype
。以下是一个自定义实现 instanceof
的简单示例:
function myInstanceof(obj, constructor) {
// 获取构造函数的原型对象
let proto = Object.getPrototypeOf(obj);
while (proto !== null) {
if (proto === constructor.prototype) {
return true;
}
proto = Object.getPrototypeOf(proto);
}
return false;
}
function Animal() {}
function Dog() {}
Dog.prototype = Object.create(Animal.prototype);
const myDog = new Dog();
console.log(myInstanceof(myDog, Dog)); // true
console.log(myInstanceof(myDog, Animal)); // true
console.log(myInstanceof(myDog, Object)); // true
console.log(myInstanceof(myDog, Array)); // false
Object.getPrototypeOf(obj)
获取对象的原型。while
循环沿原型链向上查找,直到找到匹配的原型对象或到达 null
。true
,否则返回 false
。instanceof
:用于判断一个对象是否是某个构造函数的实例。