【问题标题】:Coffeescript Classes not returning last statement of functionCoffeescript 类不返回函数的最后一个语句
【发布时间】:2012-08-18 08:10:11
【问题描述】:

我一直在使用咖啡脚本类,据我所知,函数应该总是自动返回最后一条语句。但是,我发现构造函数对象中定义的函数默认情况下不返回任何内容。这是为什么呢?

咖啡脚本

constructor: ->
  @ # <~~ returned as expected

class MyClass
  constructor: ->
    @ # <~~ not returned - why?

class MyClass
  constructor: ->
    return ->
      @ # <~~ returned like normal!

JavaScript

var MyClass;

({
  constructor: function() {
    return this;
  }
});

MyClass = (function() {

  function MyClass() {
    this;

  }

  return MyClass;

})();

MyClass = (function() {

  function MyClass() {
    return function() {
      return this;
    };
  }

  return MyClass;

})();

【问题讨论】:

    标签: coffeescript


    【解决方案1】:

    当您在类上使用“new”关键字时会调用“constructor”方法 - 因此返回值始终应该是新实例,而不是您想要返回的其他值。但是,CoffeeScripts 似乎允许您通过“return”关键字强制使用不同的返回值。

    class Foo
      constructor: -> {}
    
    f = new Foo
    f instanceof Foo   # expected to be very true...
    

    当您将普通函数命名为“构造函数”(不是方法 = 类定义之外)时,它不是构造函数而是普通函数,因此按预期返回。

    【讨论】:

    • 我想知道“显式返回”是 CoffeeScript 中的错误(即正常函数翻译的副作用)还是故意的。我可以看到有人添加了“在 ctor 中没有隐式返回”逻辑,但忽略了添加“在 ctor 中没有显式返回值”检查。至少 plain return; 做正确的事。
    • @muistooshort 好点。我发现的只是:github.com/jashkenas/coffee-script/issues/…
    【解决方案2】:

    如果你想从一个“构造函数”方法返回一个不同的对象,你 需要创建工厂方法,因为 Coffeescript 和 Javascript 不需要 允许重载“new”操作符

     class A
       @create: (params)-> new A params
       constructor: (params)-> console.log params
    
     a = A.create "foo"
    

    【讨论】:

      猜你喜欢
      • 2022-01-03
      • 2014-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-02
      相关资源
      最近更新 更多