![](/img/trans.png)
[英]Coffeescript / Javascript - why object attribute is undefined?
[英]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.