1. instanceof可用于判断某个实例是否属于某构造函数 或者 在继承关系中用来判断一个实例是否属于它的父类型或者祖先类型的实例
2. 思路:获取目标类型的显式原型prototype以及需要判断的实例的隐式原型__proto__,将实例按原型链一级一级判断,
直到__proto__为null,代表已经到Object顶层对象,此时返回false;若中途两者相等,则返回true
3. 源码:
function myInstanceof(test, goal) { let g = goal.prototype; /* 显式原型,不可用Object.getPrototypeOf()访问,返回的将是Function.prototype */ let t = test.__proto__; /* 隐式原型,用于构建原型链 */ while (true) { if (t === null) { return false; } if (t === g) { return true; } t = t.__proto__; } }
此处说明:Object.getPrototypeOf(obj) 参数中的obj应为一个实例,而非一个类型的构造函数
Object.getPrototypeOf(Object) 不是 Object.prototype JavaScript中的 Object 是构造函数(创建对象的包装器) Object.getPrototypeOf( Object )是把Object这一构造函数看作对象, 返回的当然是函数对象的原型,也就是 Function.prototype
4. 注意:
直接给一个变量赋值字符串,那么使用instanceof String返回false,因为此时变量并非一个String类型实例,如果希望返回true,则需要new String()