CoffeeScript:使用instanceof vs Class.constructor.name

时间:2012-07-27 15:24:09

标签: coffeescript

如果我有课:

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

感谢您的任何信息。

1 个答案:

答案 0 :(得分:17)

首先,constructor也是直接的JavaScript:

  

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

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

现在您可以选择使用JavaScript的constructor属性或JavaScript的instanceof运算符。 constructor只是告诉你用什么“类”来创建对象,instanceof

  

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

如果你想允许继承子,那么instanceof是正确的选择。