如果我有课:
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
?
感谢您的任何信息。
答案 0 :(得分:17)
首先,constructor
也是直接的JavaScript:
返回对创建实例原型的Object函数的引用。
所以当你说o.constructor
时,你真的在做直接的JavaScript,CoffeeScript对象初始化函数的名称constructor
是另一回事。
现在您可以选择使用JavaScript的constructor
属性或JavaScript的instanceof
运算符。 constructor
只是告诉你用什么“类”来创建对象,instanceof
:
[...]测试一个对象在其原型链中是否具有构造函数的
prototype
属性。
如果你想允许继承子,那么instanceof
是正确的选择。