【问题标题】:CoffeeScript: Using instanceof vs Class.constructor.nameCoffeeScript:使用 instanceof 与 Class.constructor.name
【发布时间】:2012-07-27 15:24:08
【问题描述】:

如果我有课:

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'

我对@9​​87654326@ 的一个论点是在使用extends 时:

class BigHaha extends Haha

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

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

另一方面,constructor.name 很清楚发生了什么。是否保证所有对象上都会设置constructor.name

感谢您提供任何信息。

【问题讨论】:

    标签: coffeescript


    【解决方案1】:

    首先,constructor 也是纯 JavaScript:

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

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

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

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

    所以如果你想允许子类化,instanceof 是正确的选择。

    【讨论】:

    • 非常感谢!只是为了确认一下,构造函数上的 name 属性是 CoffeeScript 是吗?并且对于我不关心子/超类的类是否可靠?
    • @phenomnomnominal:name comes from JavaScript's Function 是非标准的,因此它可能有效,也可能无效。使用instanceof 或直接比较constructor 函数。但实际上,只需使用instanceof
    • 我记得在coffeescript 问题中关于constructor.name 属性被closure/uglifyjs 破坏的讨论。要知道的另一件好事是instanceof 仅用于您自己的对象是真正安全的,而不是内置类型。但我同意,对于这种用途,instanceof 是更好的选择。 编辑: here is a similar discussion.
    • @LinusGThiel:我可以看到以各种方式遇到name 问题,特别是如果您正在混合 JS 和 CS(例如,M = Backbone.Model.extend({}) 是匿名的)。是的,所有的赌注都是原生类型。
    • 我一直在使用 underscore.js 进行本机类型检查 - 您是否认为 instanceof 用于我自己的类,_.isWhatever 用于本机对象相当健壮?
    猜你喜欢
    • 2018-09-04
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多