0

fn(obj,params...)JavaScript で関数型のプログラミングをしようとすると、従来のフォームがすぐに読めなくなることに気付くでしょう。

console.log(
    join(
        map(function(row){ return row.join(" "); },
            format(
                map(function(text){return align(text},
                    view),
                20))),
    "\n");

VS

view.map(function(text){return align(text)})
    .format(20)
    .map(function(row){return row.join(" ");})
    .join("\n")
    .log();

問題点として、後者のスタイルは、世界的に悪Object.prototypeと見なされている新しい機能を拡張して実装することしかできませんでした。それでも、読みやすさは非常に優れているため、とにかく先に進んで実行するように促されます. この問題を解決するより良い方法はありますか?

4

3 に答える 3

1

基本パターンは

  1. コンストラクター関数を作成し、オブジェクトの状態をプロパティとして保存しますthis
  2. 連鎖可能なメソッドをコンストラクターのプロトタイプに追加します。これらの関数の本体で、 に接続されているオブジェクトの状態を変更してからthis、 を返しthisます。
  3. チェーンの最後で使用するメソッドを提供して、カスタムのチェーン可能なオブジェクトから生の配列またはチェーン不可能な類似物に変換します。

http://jsfiddle.net/XjRrn/は実際の例です:

function ChainableArray(rawArray) {
     this._array = rawArray || [];
};
ChainableArray.prototype.map = function(fn) {
    this._array = _.map(this._array, fn);
    return this;
};
ChainableArray.prototype.incr = function(amount) {
    this._array = _.map(this._array, function (item) {return item + amount;});
    return this;
};
ChainableArray.prototype.toArray = function () {
    return _.clone(this._array);
};

mongoose.js ライブラリの Query オブジェクトは、参照するのに最適なケース スタディです。

于 2013-04-07T15:22:38.233 に答える
1

これに対する一般的な「モナディック」アプローチは、オペランドを独自のオブジェクトにラップし、そのオブジェクトで一連のメソッドを呼び出してから、プレーンな値を抽出することです。underscore.jsドキュメントの例:

var youngest = _.chain(stooges)
  .sortBy(function(stooge){ return stooge.age; })
  .map(function(stooge){ return stooge.name + ' is ' + stooge.age; })
  .first()
  .value();
于 2013-04-07T15:21:42.857 に答える