繁体   English   中英

为什么这个CoffeeScript / JavaScript没有设置创建对象的属性?

[英]Why doesn't this CoffeeScript/JavaScript set the properties of created object?

我有以下两个CoffeeScript类定义。 我期望他们有相同的行为,但他们没有。 特别是未定义对DoesNotWork实例的访问A

fields = ["A","B","C"]

class DoesNotWork
  constructor: () ->
    _.each(fields, (f) -> @[f] = ko.observable(''))

class DoesWork
  constructor: () ->
    @A = ko.observable('')
    @B = ko.observable('')
    @C = ko.observable('')

上面的代码编译成

var DoesNotWork, DoesWork, fields;
fields = ["A", "B", "C"];
DoesNotWork = (function() {
  function DoesNotWork() {
    _.each(fields, function(f) {
      return this[f] = ko.observable('');
    });
  }
  return DoesNotWork;
})();
DoesWork = (function() {
  function DoesWork() {
    this.A = ko.observable('');
    this.B = ko.observable('');
    this.C = ko.observable('');
  }
  return DoesWork;
})();

我错过了什么新手JS?

另一个解决方案(可以说是最具可读性和最高效的)是跳过_.each而是for...in迭代中使用CoffeeScript for...in

for f in fields
  @[f] = ko.observable ''

你甚至可以修改循环以使其成为一个单行:

@[f] = ko.observable('') for f in fields

请记住,CoffeeScript中的循环不会创建上下文或影响范围; 只有功能。

传递给_.each的匿名函数中的'this'绑定到匿名函数,而不是父对象。 _.each确实允许传递上下文对象,以便正确绑定它

http://documentcloud.github.com/underscore/#each

所以在每个第3个arg中将ref传递给你想要绑定的对象:

class ShouldWorkNow
  constructor: () ->
    _.each(fields, ((f) -> @[f] = ko.observable('')),this)

Craig的答案是正确的,但另一种解决方案是将匿名函数定义为绑定函数 在这种情况下,那会让你写

_.each(fields, ((f) => @[f] = ko.observable('')))

=>将函数绑定到它定义的上下文中,这样无论它如何被调用, this总是意味着函数中的相同内容。 它是一个回调非常有用的技术,但在案件_.each ,这是一个有点不是传递效率较低this英寸

你可以通过写作使用Underscore做同样的事情

callback = _.bind ((f) -> @[f] = ko.observable('')), this
_.each(fields, callback)

但是=>你省去了很多打字!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM