如果我有一个类:
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
是正确的选择。