CoffeeScript:使用实例与 Class.constructor.name



如果我有一个类:

class Haha
  constructor: (@lolAmount = 1) ->
    alert @lolAmount

我想检查一个对象是否属于正确的类,使用constructor.name是否总是安全的:

haha = new Haha()
unless haha.constructor.name is 'Haha'
  throw Error 'Wrong type'

还是使用instanceof更好:

haha = new Haha()
unless haha instanceof Haha
  throw Error 'Wrong type'

我对instanceof的一个论点是使用 extends 时:

class BigHaha extends Haha
bigHaha = new BigHaha
console.log bigHaha instanceof Haha #true

但是作为一个JavaScript操作员,它有多安全 - 我觉得我应该对此持怀疑态度。

另一方面,有了constructor.name,正在发生的事情就很清楚了。是否保证在所有对象上设置constructor.name

感谢您提供任何信息。

首先,constructor也是直的JavaScript:

返回对创建实例原型的 Object 函数的引用。

所以当你说o.constructor,你实际上是在做直接的JavaScript,CoffeeScript对象初始化函数的名称constructor是另一回事。

所以现在你可以选择使用 JavaScript 的 constructor 属性或 JavaScript 的 instanceof 运算符。constructor只是告诉你使用什么"类"来创建对象,instanceof另一方面:

[...]测试对象的原型链中是否具有构造函数的prototype属性。

因此,如果您想允许子类化,instanceof是正确的选择。

相关内容

最新更新