我想通过向原型添加方法来添加扩展javascript对象的功能.
该方法将接收一个或多个其他对象,并将所有键/值添加到this.
这就是我想出的:
Object::extend = (objects...) ->
@[key] = value for key, value of object for object in objects
Run Code Online (Sandbox Code Playgroud)
或这个:
Object::extend = (objects...) ->
for object in objects
for key, value of object
@[key] = value
Run Code Online (Sandbox Code Playgroud)
两者都按预期工作,并编译成相同的JavaScript代码:
var __slice = [].slice;
Object.prototype.extend = function() {
var key, object, objects, value, _i, _len, _results;
objects = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
_results = [];
for (_i = 0, _len = objects.length; _i < _len; _i++) {
object = objects[_i];
_results.push((function() {
var _results1;
_results1 = [];
for (key in object) {
value = object[key];
_results1.push(this[key] = value);
}
return _results1;
}).call(this));
}
return _results;
};
Run Code Online (Sandbox Code Playgroud)
我不太高兴的是每个for循环创建的整个结果,这对我来说是完全多余的.
有没有办法让代码更像:
Object.prototype.extend = function() {
var key, object, objects, value, _i, _len;
objects = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
for (_i = 0, _len = objects.length; _i < _len; _i++) {
object = objects[_i];
(function() {
for (key in object) {
value = object[key];
this[key] = value;
}
}).call(this);
}
};
Run Code Online (Sandbox Code Playgroud)
谢谢.
我知道我可以简单地嵌入 javascript代码,但寻找coffeescript解决方案.
您可以尝试添加显式return:
Object::extend = (objects...) ->
for object in objects
for key, value of object
@[key] = value
return
Run Code Online (Sandbox Code Playgroud)
这会产生这样的结果:
var __slice = [].slice;
Object.prototype.extend = function() {
var key, object, objects, value, _i, _len;
objects = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
for (_i = 0, _len = objects.length; _i < _len; _i++) {
object = objects[_i];
for (key in object) {
value = object[key];
this[key] = value;
}
}
};
Run Code Online (Sandbox Code Playgroud)
每个 CoffeeScript 函数都会返回函数中最后一个表达式的值,CoffeeScript 循环也是表达式。这意味着 CoffeeScript 必须构建所有这些_results内容才能为您的函数生成返回值,因为您隐式return应用于外部循环。如果您通过添加显式的“不返回任何内容”来删除该隐式return,那么 CS→JS 编译器似乎足够聪明,不会做所有额外的_results工作。
| 归档时间: |
|
| 查看次数: |
4962 次 |
| 最近记录: |