5

プロトタイプにメソッドを追加して、JavaScript オブジェクトを拡張する機能を追加したいと考えています。
このメソッドは、1 つ以上の他のオブジェクトを受け取り、すべてのキー/値を に追加します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 ソリューションを探しています。

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 に答える