扩展JavaScript对象具有的CoffeeScript(Extending Javascript

2019-09-17 21:51发布

我想补充添加一个方法的原型扩展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代码,但是找了CoffeeScript的解决方案。

Answer 1:

你可以尝试添加一个明确的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工作。



文章来源: Extending Javascript objects with CoffeeScript