instanceof
Java的保留关键字
instanceof是Javaphp的一个二元操作符(运算符),和==,>,<是同一类东西。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是判断其左边对象是否为其右边类的实例,返回boolean类型的数据。可以用来判断继承中的子类的实例是否为父类的实现。相当于c#中的is操作符。java中的instanceof是通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。
用法
boolean result = object instanceof class
参数
Result:布尔类型
Object:必选项。任意对象表达式。
class:必选项。任意已定义的对象类。
说明
如果 object 是 class 的一个实例,则 instanceof 运算符返回 true。如果 object 不是指定类的一个实例,或者 object 是 null,则返回 false。
语法
object instanceof constructor
参数
描述
instanceof运算符用来检测constructor.prototype是否存在于参数object的原型链上。
需要注意的是,如果表达式obj instanceof Foo返回true,则并不意味着该表达式会永远返回true,因为Foo.prototype属性的值有可能会改变,改变之后的值很有可能不存在于obj的原型链上,这时原表达式的值就会成为false。另外一种情况下,原表达式的值也会改变,就是改变对象obj的原型链的情况,虽然在ES规范中,我们只能读取对象的原型而不能改变它,但借助于非标准的__proto__伪属性,是可以实现的。比如执行obj.__proto__ = {}之后,obj instanceof Foo就会返回false了。
instanceof和多全局对象
在浏览器中,我们的脚本可能需要在多个窗口之间进行交互。多个窗口意味着多个全局环境,不同的全局环境拥有不同的全局对象,从而拥有不同的内置类型构造函数。这可能会引发一些问题。比如,表达式[] instanceof window.frames[0].Array会返回false,因为Array.prototype !== window.frames[0].Array.prototype,并且数组从前者继承。
比如检测一个Nodes在另一个窗口中是不是SVGElement,你可以使用myNode instanceof myNode.ownerDocument.defaultView.SVGElement。
示例
1.演示String对象和Date对象都属于Object类型和一些特殊情况节
下面的代码使用了instanceof来证明:String和Date对象同时也属于Object类型(他们是由Object类派生出来的)。
但是,使用对象文字符号创建的对象在这里是一个例外:虽然原型未定义,但instanceof Object返回true。
2.演示mycar属于Car类型的同时又属于Object类型
下面的代码创建了一个类型Car,以及该类型的对象实例mycar.instanceof运算符表明了这个mycar对象既属于Car类型,又属于Object类型。
3.不属于某实例
要测试对象是否不是某特定构造函数的实例,你可以这样做
这和以下代码完全不同
这段代码永远会得到false(!mycar将在instanceof之前被处理,所以你总是在验证一个布尔值是否是Car的一个实例)。
参考资料
最新修订时间:2023-05-09 00:30
目录
概述
用法
参数
说明
语法
参考资料