首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js的instanceof

instanceof 是 JavaScript 中的一个运算符,用于检测一个对象是否是某个构造函数的实例。它基于原型链进行检查,如果对象的原型链上存在构造函数的 prototype 属性,则返回 true,否则返回 false

基础概念

  • 原型链:JavaScript 中的对象有一个内部属性 [[Prototype]],它指向另一个对象,即该对象的原型。当试图访问一个对象的属性时,如果该对象本身没有这个属性,JavaScript 会沿着原型链向上查找,直到找到该属性或者到达原型链的末端(null)。
  • 构造函数:在 JavaScript 中,函数可以作为构造函数来创建对象。通过 new 关键字调用构造函数时,会创建一个新的对象,并将构造函数的 this 绑定到这个新对象上。

优势

  • 类型检查instanceof 可以用来检查一个对象是否是由特定的构造函数创建的,这对于类型检查和确保对象的正确性很有用。
  • 灵活性:由于 JavaScript 是基于原型的继承,instanceof 可以很好地处理跨iframe或跨窗口的对象实例检查。

类型

instanceof 运算符本身没有类型,它返回一个布尔值:truefalse

应用场景

  • 类型验证:在编写函数或方法时,可能需要验证传入的参数是否是预期的类型。
  • 框架目标定位:在 Web 开发中,可以使用 instanceof 来确定一个对象是否属于某个特定的框架或库,比如检查一个对象是否是某个 DOM 元素的实例。

示例代码

代码语言:txt
复制
function Car(make, model, year) {
  this.make = make;
  this.model = model;
  this.year = year;
}

const auto = new Car('Honda', 'Accord', 1998);

console.log(auto instanceof Car); // true
console.log(auto instanceof Object); // true,因为所有对象都是 Object 的实例

遇到的问题及解决方法

问题:跨iframe的 instanceof 检查失效

在不同的 iframe 或窗口中,即使两个对象是由相同的构造函数创建的,它们也不会被认为是同一个构造函数的实例,因为每个 iframe 或窗口都有自己的全局上下文和原型链。

解决方法

  • 使用 Object.prototype.toString.call(obj) 来获取对象的内部 [[Class]] 属性,这是一种更通用的检查对象类型的方法。
  • 如果需要在不同的上下文中共享对象类型信息,可以考虑使用其他方式来标识对象类型,比如添加一个特殊的属性来标记对象的类型。

示例代码:使用 Object.prototype.toString.call

代码语言:txt
复制
function Car(make, model, year) {
  this.make = make;
  this.model = model;
  this.year = year;
}

const auto = new Car('Honda', 'Accord', 1998);

console.log(Object.prototype.toString.call(auto) === '[object Object]'); // true

这种方法可以用来检查对象是否是普通对象,但它不会告诉你对象是由哪个构造函数创建的。如果需要检查特定的构造函数,通常需要在同一个全局上下文中进行。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • JS魔法堂:再识instanceof

    一、Breif                                  大家都知道instanceof一般就是用来检查A对象是否为B类或子类的实例。...那问题是JS中没有类的概念更没有类继承的概念(虽然有构造函数),那么instanceof到底是怎样判断A对象是B构造函数的实例呢?本文将对此作分析记录,以便日后查阅。...ShiftExpression的实际值(GetValue(Evaluate(ShiftExpression)))必须为[object Function],否则就抛TypeError异常; 2. instanceof...上面的定义看得不太明白,我们把它翻译成JS的实现吧 // IE5.5~9下,由于无法通过__proto__访问对象的Internal Property [[Prototype]],因此该方法无效 ;(function...五 、Conclusion                           之前看了很多讲述instanceof的文章但始终对它理解得不透彻,看来还是看Spec比较实在。

    85890

    JS 原生方法原理探究(五):如何实现 instanceof?

    这是JS 原生方法原理探究系列的第五篇文章。本文会介绍如何实现 instanceof 方法。 typeof 操作符返回一个表示数据类型的字符串,它可以应付常规场景下的数据类型判断。...但使用 instanceof 之后,就一目了然了: console.log(obj1 instanceof F1) // true console.log(obj1 instanceof F2)...// false console.log(obj2 instanceof F2) // true 根据 MDN 的描述: instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上...instanceof 运算符有两个操作数,左操作数通常是一个实例对象,它的类型可以是对象或者函数,也可以是基本类型(这种情况下不会报错,但总返回 false),右操作数通常是一个可调用的(callable...那么 instanceof 的实现原理是什么呢?

    1.9K20

    JS手撕(一)    类型判断、instanceof、数组去重

    JS手撕(一)    类型判断、instanceof、数组去重 前言 看这篇文章的小伙伴,建议看完每一节,都尝试自己手撕一遍,最好就是弄懂原理后再开始手撕(不要边看边手撕,会产生依赖),本人就是看别人的文章后手撕的...(因为手撕题型记不住,还有一些大佬有很有意思的解法) 类型判断 有用过JS一段时间的小伙伴应该对typeof比较属性,我们需要进行类型判断的时候一般都会先想到它。...但是呢,它有一个很大的局限性,比如如果是null、array都会被认为是object,array是因为是一个特殊的对象,而null则是因为JS诞生以来null的实现导致的。...上面已经有小小的提到的typeof,那么当然不能拉下它的好兄弟instanceof啦。...开始手撕之前,先复习一下instanceof究竟是啥。 MDN上的介绍已经很简单易懂了:instanceof运算符用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上。

    1.7K10

    typeof和instanceof的区别

    JS里面判断数据类型,一般用typeof或者instanceof两种方法,那么,两者到底有什么区别呢? 1. typeof typeof用于基本数据类型的类型判断,返回值都为小写的字符串。...instanceof 利用原型链继承关系做判断,它针对对象类型(格式:对象 instanceof 构造函数)。...“尽管instanceof 运算符的右操作数是构造函数,但计算过程实际上是检测了对象的继承关系,而不是检测创建对象的构造函数 ”(摘自《JavaScript权威指南》) 2.1 原型对象 一旦创建一个新函数...prototype.png 这时根据用instanceof做类型检测,结果如下: instance instanceof SubType === true instance instanceof SuperType...小结 typeof用于基本数据类型的类型判断,无法甄别对象具体类型(除了function); instanceof用于对象的类型判断,基于原型链上的继承关系; (感谢@文兴的发现,文章于2017-3-6

    82540
    领券