【问题标题】:Check if an object's immediately inherits from constructor检查对象是否立即从构造函数继承
【发布时间】: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


【解决方案1】:

既然JavaScript中有原型和类,有没有一个词可以换成“原型/类”的写法?

原型是指原型对象。术语类要么是指代表类的js对象,即构造函数,要么是指由构造函数、原型和方法组成的整个事物。所以你可以只使用广义上的“类”这个词。

什么方法只会根据给定的原型/类检查对象的直接祖先原型/类?

您可以检查构造函数,假设您的原型对象设置正确:

 interruptObject.constructor == Interrupt

或者你可以直接检查原型对象:

 Object.getPrototypeOf(interruptObject) == Interrupt.prototype

然而,我会避免这两种情况,而是有一个方法 isNeitherHardwareNorSoftwareInterrupt(或您正在寻找的任何东西)返回一个布尔值,并在 Interrupt 及其子类上相应地实现它。

【讨论】:

  • 关于中断的东西就是一个例子。如果我正在寻找一种方法来检查任何给定的对象和原型/类对,使用像isNeitherHardwareNorSoftwareInterrupt 这样的方法是不可行的。另外,我认为您对引用的第一个问题的回答实际上并不是对该问题的回答。
  • @Melab 那么你的实际用例是什么?用继承建模中断确实不是一个很好的例子,检查既不是HardwareInterrupt 也不是SoftwareInterrupt 的中断几乎没有意义,因为没有第三类中断。但我的建议是,对您要检查的属性使用描述性方法 - 遵循开闭原则。
  • @Melab 我认为您关于替换“原型/类”的问题的答案是使用广义上的“类”一词。
猜你喜欢
  • 2017-01-13
  • 2012-08-28
  • 2015-09-08
  • 2013-01-24
  • 2018-06-06
  • 2014-12-27
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多