【问题标题】:How do I assign a static class property that needs quotations in CoffeeScript?如何分配需要在 CoffeeScript 中引用的静态类属性?
【发布时间】:2013-12-13 02:28:21
【问题描述】:

我使用了一个库proxyquire,它包装了 Node 的 require 方法以允许 Mock 对象注入。其中一个特点是它使用原始模拟对象扩展了缺失的属性。您可以通过在模拟对象上设置一个名为@noCallThru 的属性来关闭它,如下所示:

MockObj =
  stubFunc: ->
  "@noCallThru": true

proxyquire "path/to/module",
  "path/to/mocked_module": MockObj

有些模块是构造函数(类),所以要模拟它们,您可以使用 CoffeeScript 的类系统。然而,@noCallThru 的使用会在返回的对象(在本例中是类)上进行检查,并且由于它不是实例,因此不会使用原型。 @noCallThru 需要是类的静态属性。

如何为需要引号的 CoffeeScript 类定义静态属性?我能想到的最好的办法就是像这样注入严格的 JavaScript:

class MockClass
  stubFunc: ->
  `MockClass['@noCallThru'] = true`

有没有更好的办法?

【问题讨论】:

    标签: coffeescript


    【解决方案1】:

    您不需要将其作为 JavaScript 注入。你可以这样做:

    class MockClass
      stubFunc: ->
      @['@noCallThru'] = true
    

    (因为在类定义中,this@ 指的是类/构造函数本身)

    以上代码编译为:

    var MockClass;
    
    MockClass = (function() {
      MockClass.name = 'MockClass';
      function MockClass() {}
      MockClass.prototype.stubFunc = function() {};
      MockClass['@noCallThru'] = true;
      return MockClass;
    })();
    

    【讨论】:

    • @['@noCallThru'] = true 会更接近于通常的@class_prop = x
    • @muistooshort:谢谢,把它移到答案的第一部分。
    猜你喜欢
    • 2014-08-18
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多