前言:
原型和原型链作为 JS 的重要知识点,是很多面试经常考查的内容,关于 JS 原型与原型链的讲解,可以 看我的 另一篇文章,本篇文章主要介绍 一个基于原型链的方法 instanceof ,下面是实现该方法的手写代码讲解
手写 instanceof
instanceof
instanceof
运算符用于测试构造函数的 prototype
属性是否出现在对象原型链中的任何位置。
手写代码
//判断 变量R的原型是否 存在于 变量L的原型链上
function instance_of (L, R) {
// 验证如果为基本数据类型,就直接返回 false
const baseType = ['string', 'number', 'boolean', 'undefined', 'symbol']
if(baseType.includes(typeof(L))) {
return false
}
let RP = R.prototype; // 取 R 的显示原型
L = L.__proto__; // 取 L 的隐式原型
while (true) {
if (L === null) { // 找到最顶层
return false;
}
if (L === RP) { // 严格相等
return true;
}
L = L.__proto__; // 没找到继续向上一层原型链查找
}
}
instanceof 操作介绍
代码
function Foo(name) {
this.name = name;
}
var f = new Foo('nick')
f instanceof Foo // true
f instanceof Object // true
上述代码判断流程大致如下:
1、 f instanceof Foo
: f
的隐式原型 __proto__
和 Foo.prototype
,是相等的,所以返回 true
。
2、 f instanceof Object
: f
的隐式原型 __proto__
,和 Object.prototype
不等,所以继续往上走。 f
的隐式原型 __proto__
指向 Foo.prototype
,所以继续用 Foo.prototype.__proto__
去对比 Object.prototype
,这会儿就相等了,因为 Foo.prototype
就是一个普通的对象。