JS之instanceof详解

JS之instanceof详解instanceof用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上。语法:objectinstanceofconstructorobject:某个实例对象constructor:某个构造函数用来检测constructor.prototype是否存在于参数object的原型链上。示例//定义构造函数functionC(){}functionD(){}//实例化一个o对象varo=newC()//tru

大家好,又见面了,我是你们的朋友全栈君。

instanceof

用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。

  • 语法:object instanceof constructor
    • object:某个实例对象
    • constructor:某个构造函数

用来检测 constructor.prototype 是否存在于参数 object 的原型链上。

示例

// 定义构造函数
function C () { 
   }
function D () { 
   }
// 实例化一个 o 对象
var o = new C()
// true,true --> C.prototype 在 o 的原型链上
console.log(o instanceof C, o.__proto__ === C.prototype, '此时 o 的 __proto__:', o.__proto__, '此时 C 的 prototype:', C.prototype)
// false,false --> D.prototype 不在 o 的原型链上
console.log(o instanceof D, o.__proto__ === D.prototype)
// true true --> Object.prototype 在 o 的原型链上
console.log(o instanceof Object, o.__proto__.__proto__ === Object.prototype)
// 这时我们修改构造函数 C 的原型为一个空对象
C.prototype = { 
   }
// 实例化一个 o2 对象
var o2 = new C()
// true --> C.prototype 在 o2 的原型链上
console.log(o2 instanceof C)
// false,C.prototype 指向了一个空对象,这个空对象不在 o 的原型链上.
console.log(o instanceof C, '此时 o 的 __proto__:', o.__proto__, '此时 C 的 prototype:', C.prototype)
console.log('此时 D 的 prototype:', D.prototype);
// 继承
D.prototype = new C()
console.log('此时 D 的 prototype:', D.prototype);
var o3 = new D()
// true, true --> 因为 o3 是 构造函数 D new 出来的实例对象,所以 D.prototype 一定在 o3 的原型链上
console.log(o3 instanceof D, o3.__proto__ === D.prototype)
// true --> 因为 C.prototype 现在在 o3 的原型链上
console.log(o3 instanceof C)
// true,true --> 上面的结果为什么为 true 呢,看如下代码,D.prototype 是 构造函数 C new 出来的实例对象,所以 C.prototype 一定在 D.prototype 的原型链上
console.log(o3.__proto__ === D.prototype, D.prototype.__proto__ === C.prototype);
// true 相当于如下代码
console.log(o3.__proto__.__proto__ === C.prototype);

运行结果如图所示

JS之instanceof详解

一些容易出错的点

var simpleStr = "This is a simple string"; 
var myString = new String();
var newStr = new String("String created with constructor");
var myDate = new Date();
var myObj = { 
   };
var myNonObj = Object.create(null);

// 返回 false, simpleStr 并不是对象
simpleStr instanceof String;
// 返回 true
myString instanceof String;
// 返回 true
newStr instanceof String;
// 返回 true
myString instanceof Object;
// 返回 true
myObj instanceof Object;
// 返回 true
({ 
   }) instanceof Object;
// 返回 false, 一种创建非 Object 实例的对象的方法
myNonObj instanceof Object;
// 返回 false
myString instanceof Date;
// 返回 true
myDate instanceof Date;
// 返回 true
myDate instanceof Object;
// 返回 false
myDate instanceof String; 

Object.create(null) 会造成创建的对象其 __proto__ 指向为空

JS之instanceof详解

instanceof 判断基本数据类型的方法

其实就是自定义 instanceof 行为的一种方式,这里将原有的 instanceof 方法重定义,换成了 typeof,因此能够判断基本数据类型。

class PrimitiveNumber { 
   
  static [Symbol.hasInstance](x) { 
   
    return typeof x === 'number'
  }
}
// true
console.log(111 instanceof PrimitiveNumber)

手动实现一下instanceof的功能

function copyInstanceof (source, target) { 
   
    // 基本数据类型以及 null 直接返回 false
    if (!['function', 'object'].includes(typeof source) || source === null) return false
    // getProtypeOf 是 Object 对象自带的一个方法,能够拿到参数的原型对象
    let proto = Object.getPrototypeOf(source)
    while (true) { 
   
        // 查找到尽头,还没找到
        if (proto == null) return false
        // 找到相同的原型对象
        if (proto == target.prototype) return true
        proto = Object.getPrototypeOf(proto)
    }
}
console.log(copyInstanceof("111", String)); // false
console.log(copyInstanceof(new String("111"), String)); // true
console.log(copyInstanceof(Date, Function)); // true
console.log(copyInstanceof(null, Object)); // false
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163371.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月23日 下午7:46
下一篇 2022年7月23日 下午7:46


相关推荐

  • 前端面试八股文(超详细)

    前端面试八股文(超详细)JavaScript 1 Promise 的理解 Promise 是一种为了避免回调地狱的异步解决方案 2 Promise 是一种状态机 pending 进行中 fulfilled 已成功 和 rejected 已失败 只有异步操作的结果 可以决定当前是哪一种状态 任何其他操作都无法改变这个状态 回调地狱回调函数中嵌套回调函数的情况就叫做回调地狱 回调地狱就是为是实现代码顺序执行而出现的一种操作 它会造成我们的代码可读性非常差 后期不好维护 一 Promise 是什么 Promise 是最早

    2026年3月17日
    1
  • 在 Php 中把 Allow_url_fopen 打開的風險[通俗易懂]

    在 Php 中把 Allow_url_fopen 打開的風險[通俗易懂]https://blog.teatime.com.tw最近老是在我的/tmp裡頭,發現有個多出來的/tmp/cmdtemp檔案.也在apache的error_log中發現一些訊息如下:sh:-c:line1:syntaxerrornearunexpectedtoken`;’sh:-c:line1:`;1>/tmp/cmdtemp2>…

    2022年7月16日
    17
  • 对面板数据模型中的一些理解

    对面板数据模型中的一些理解一 我对几种面板数据模型的理解 1 混合效应模型 nbsp pooledmodel nbsp nbsp nbsp nbsp 就是所有的省份 都是相同 即同一个方程 截距项和斜率项都相同 yit c bxit it nbsp nbsp nbsp nbsp nbsp c 与 b 都是常数 2 固定效应模型 fixed effectmodel nbsp 和随机效应模型 random effectsmodel nbsp nbsp nbsp 就是所有省份 既有相同的部分 即斜率项都

    2026年3月16日
    2
  • Linux应用开发自学之路

    Linux应用开发自学之路 前言    在「关于我 」那篇博文里,朋友们应该知道了我不是科班出身,是由机械强行转行到Linux应用开发方向。下面我就详细向大家介绍自己这一路上的转行历程,希望对大家有所启发。 我是学机械专业的,对于机械专业我还是很感兴趣,而且当年这个专业也是我自己选择的。本科时成绩没排第一,但也排专业前列。硕士时成绩一直是专业第一,还拿过国家奖学金。由此可见,我还是挺热爱机…

    2022年5月22日
    39
  • 大数据采集平台ZDH_WEB安装部署

    大数据采集平台ZDH_WEB安装部署数据采集平台管理端https://github.com/zhaoyachao/zdh_web数据采集平台服务https://github.com/zhaoyachao/zdh_serverweb端在线查看http://zycblog.cn:8081/login用户名:zyc密码:123456界面只是为了参考功能,底层的数据采集服务需要自己下载zdh_server部署,服务器资源有限,请手下留情如果觉得项目不错记得分享给同伴和点star!!!…

    2022年5月1日
    60
  • 逆矩阵的伴随阵的求法_伴随矩阵与原矩阵的特征值

    逆矩阵的伴随阵的求法_伴随矩阵与原矩阵的特征值1、简单介绍         一个方阵A如果满足,则A可逆,且

    2022年8月21日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号