5

我想通过向原型添加方法来添加扩展 javascript 对象的能力。
该方法将接收一个或多个其他对象并将所有键/值添加到this.
这就是我想出的:

Object::extend = (objects...) ->
    @[key] = value for key, value of object for object in objects

或这个:

Object::extend = (objects...) ->
    for object in objects
        for key, value of object
            @[key] = value 

两者都按预期工作,并编译成相同的 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;
};

我不太高兴的是每个 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);
  }
};

谢谢。


编辑

我知道我可以简单地嵌入javascript 代码,但正在寻找一个咖啡脚本解决方案。

4

1 回答 1

4

您可以尝试添加显式return

Object::extend = (objects...) ->
    for object in objects
        for key, value of object
            @[key] = value
    return 

这产生了这个:

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;
    }
  }
};

每个 CoffeeScript 函数都返回函数中最后一个表达式的值,CoffeeScript 循环也是表达式。这意味着 CoffeeScript 必须构建所有这些_results东西来为你的函数生成一个返回值,因为你有一个隐式return应用到外部循环。如果您通过添加显式“不返回任何内容”来删除该隐式return,那么 CS→JS 编译器似乎足够聪明,不会做所有额外的_results工作。

于 2012-06-08T00:46:24.983 回答