【发布时间】:2019-09-11 22:33:34
【问题描述】:
instanceof 运算符不适用于只需要检查继承链中值的父级的用途。
这是一个使用instanceof 来检查对象的类型的实例,返回的结果是错误的:
{} instanceof Object; // returns true, the desired result
[] instanceof Object; // returns true, not the desired result
instanceof 检查右侧的任何内容是否存在于左侧任何内容的原型链中的任何位置。这是预期的,但是如果我想知道一个值是否是一个普通的对象,例如。如果我有:
- 原型/类
Interrupt, - 一个原型/类
HardwareInterrupt,继承自Interrupt, - 一个原型/类
SoftwareInterrupt,继承自Interrupt, - 一个原型/类
MaskableInterrupt,继承自HardwareInterrupt, - 以及继承自
HardwareInterrupt的原型/类NonmaskableInterrupt,
然后,如果我想知道一个对象是否在层次结构中紧接在 Interrupt 之下,instanceof 可能会返回一个不准确的结果,例如 Nonmaskable instanceof Interrupt 评估为 true。什么方法只会根据给定的原型/类检查对象的直接祖先原型/类?
无论如何,用什么来描述一个对象的实例化的正确术语是什么?在写这个问题时,我想说“类型”,但我意识到,作为一个例子,说可屏蔽中断是一种硬件中断也是有效的(尽管我可以想到像这样使用“类型”的例子不正确)。而且既然JavaScript中有原型和类,那有没有一个词可以换成“prototype/class”的写法呢?
【问题讨论】:
-
为什么不直接用更具体的类型执行
typeof测试呢?考虑到继承的典型含义,运算符的工作方式是有意义的;NonmaskableInterrupt实例是Interrupt实例。 -
@Pointy
typeof不会告诉我对象是从什么实例化的(例如,typeof []不会返回Array)。我已经承认instanceof按预期方式工作。 -
Object.getPrototypeOf()有帮助吗?
标签: javascript oop inheritance types