js 手写instanceOf判断对象是否为构造函数的实例对象
/** * 手写instanceOf判断对象是否为构造函数的实例对象 * @param {Object} obj 实例对象 * @param {Function} constructor 构造函数 * @returns Boolean */ function myInstanceOf(obj, constructor) { //typeof判断obj数据类型必须为object和function。因为null的typeof为function 所以首先判断为null的特殊情况 if (obj === null || typeof obj !== "object" || typeof constructor !== "function") { return false; } let pointer = obj.__proto__;//获取obj对象的原型 //原型链顶层__proto__为null while (pointer !== null) { //循环查找__proto__如果等于prototype if (pointer === constructor.prototype) { return true; } else { //如果obj.__proto__不等于constructor.prototype 继续查找 原型的原型obj.__proto__.__proto__ 直到查找到最顶层原型null为止 pointer = pointer.__proto__; } } //如果查询不到 说明obj对象不是constructor构造函数的实例 return false; }
typeof、instanceof的区别和使用
typeof 用于区分对象和其它原始类型(七种原始数据类型sting number bigint null undefined symbol boolean)
三种例外情况:
1.typeof null 值为 object
2.对象(非函数)、数组 的typeof为 object ,
3.函数的typeof 为 function
instanceof 用于检测 右值的prototype 是否出现在左值的原型链(__proto__)上,也就是检测左值对象是否为右值构造函数的实例。
总结 typeof 检测左值属于哪种原始数据类型(三种情况例外)。instanceof 检测左值对象类型归属,左值不是对象则返回flase
浙公网安备 33010602011771号