CoffeeScript:使用instanceof vs Class.constructor.name

phe*_*nal 12 coffeescript

如果我有课:

class Haha
  constructor: (@lolAmount = 1) ->
    alert @lolAmount
Run Code Online (Sandbox Code Playgroud)

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

haha = new Haha()
unless haha.constructor.name is 'Haha'
  throw Error 'Wrong type'
Run Code Online (Sandbox Code Playgroud)

或者它是否更好用instanceof:

haha = new Haha()
unless haha instanceof Haha
  throw Error 'Wrong type'
Run Code Online (Sandbox Code Playgroud)

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

class BigHaha extends Haha

bigHaha = new BigHaha
console.log bigHaha instanceof Haha #true
Run Code Online (Sandbox Code Playgroud)

但是作为一个JavaScript运算符是多么安全 - 我觉得我应该对它持怀疑态度.

另一方面,constructor.name很明显发生了什么.是否保证constructor.name将在所有对象上设置?

谢谢你的任何信息.

mu *_*ort 17

首先,constructor也是直接的JavaScript:

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

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

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

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

instanceof如果你想允许子类化,那么这是正确的选择.