instanceof
是 JavaScript 中的一个关键字,用于检测构造函数的 prototype
属性是否出现在某个实例对象的原型链中的任何位置。这意味着它可以用来判断一个对象是否为某个构造函数的实例。下面详细解释 instanceof
的实现原理和内部工作机制。
实现原理
-
原型链:在 JavaScript 中,每个对象都有一个内部属性
[Prototype]
(在 ES6 中称为__proto__
),这个属性指向创建它的构造函数的prototype
属性。当一个对象试图访问一个不存在的属性时,JavaScript 引擎会沿着这个原型链向上查找,直到找到该属性为止。 -
instanceof
操作:当你使用instanceof
来检测一个对象是否是某个构造函数的实例时,实际上就是在检查这个构造函数的prototype
是否出现在该对象的原型链中。
内部机制
instanceof
的内部机制大致如下:
- 获取构造函数的 prototype:首先获取右边构造函数的
prototype
属性。 - 获取对象的原型:然后获取左边对象的原型链。
- 比较原型链:检查左边对象的原型链中是否包含右边构造函数的
prototype
属性。
如果包含,则返回 true
,否则返回 false
。
示例代码
假设我们有两个构造函数 Person
和 Student
,其中 Student
继承自 Person
:
function Person(name) {
this.name = name;
}
function Student(name, grade) {