5

免責事項: (1) 私のバックグラウンドは Java/C# で、先週 JavaScript を深く掘り下げ始めたばかりです。(2) _.mixin() メソッドについては知っています。

これはプロジェクト クリティカルではありませんが、Javascript でのオブジェクトの継承について頭を悩ませています。

たとえば、評価関数を満たすキーのリストを返すために、underscore.js を _.keyFilter 関数で拡張しようとしました (map を使用して同様のことを実現できることに気付きました)。_.mixin() メソッドで結果を得ることができます:

関数をソースコードに直接ドロップする以外に、_.mixin()

 _.mixin({ filterKey : function(obj, iterator, context) {
    var results = [];
    if (obj == null) return results;
    _.each(obj, function(value, index, list) {
        if (iterator.call(context, value, index, list)){
            results[results.length] = index;
        }
    });
    return results;
}});

ただし、スクリプトファイルで次のようにアンダースコアを単純に拡張できない理由を理解しているかどうかはわかりません。

_.keyFilter = function(obj, iterator, context) {
        var results = [];
        if (obj == null) return results;
        each(obj, function(value, index, list) {
            if (iterator.call(context, value, index, list)) results[results.length] = index;
        });
        return results;
};

これを行ってから、次のように呼び出してみました:

_.chain(myList).keyFilter(evalFunction);

次の例外が発生します。

'Uncaught TypeError: Object [object Object] has no method 'keyFilter' 

上記の方法は、underscore.js のソース コードにドロップすると機能することに注意してください。

それで、スクリプトファイルでプロトタイプ(まだ完全には把握していません)を使用してみました:

var keyFilter = _.prototype.keyFilter = function(obj, iterator, context) {
        var results = [];
        if (obj == null) return results;
        each(obj, function(value, index, list) {
            if (iterator.call(context, value, index, list)) results[results.length] = index;
        });
        return results;
};

しかし、これは同じ例外をスローしました。(下の var がスクリプトの一番上までハイキングされていると思ったので、上記の推移的な割り当ての有無にかかわらずこれを試しました)。

説明をいただければ幸いです。

4

2 に答える 2

4

これは、独自の方法で処理を行う傾向があるアンダースコアに関する質問よりも、JavaScriptに関する質問ではありません。

  • _プロパティ(つまり)としてメソッドを追加するだけでメソッドを追加する_.keyFilter = ...ことは、Javaのクラスに静的メソッドを追加することに似ています。オブジェクトにメソッドを追加してい_ますが、の残りの機能とは関係がありません_。これは、新しいユーティリティメソッドを追加するための合理的な方法ですが、アンダースコアのラッピングおよびチェーン機能を使用する場合はそうではありません。

  • を使用.mixin()すると、Underscoreのラッピングおよびチェーンアーキテクチャに接続できます。これはアンダースコアに固有です-JavaScriptの一部ではありません。ソースコードを編集する以外に、これは、アンダースコアライブラリ内のプライベートメソッドと変数に大きく依存するこれらのアンダースコア機能を利用するために私が知っている唯一の方法です。

  • JSは典型的な継承をサポートし、すべてのオブジェクトにはprototypeプロパティがありますが、多くの開発者は他のアプローチまたは他のタイプの継承を使用します。prototypeコンストラクターのように見えるものにメソッドを追加することは、その背後にあるコードを知らない限り、実際に機能するというのは一般的に安全な仮定ではありません。アンダースコア、ラップされたオブジェクトにプロトタイプの継承を使用しますが、ねじれた、少し魔法のような方法で、ウィルにメソッドを追加しても望ましい効果はないと思いますprototype-一つには、それが機能したとしても、プロトタイプはアンダースコアでのみ使用されますラップされたオブジェクトの場合、_.keyFilter(...)間違いなく機能しません。

于 2012-09-06T00:25:20.540 に答える
0

(既に述べたように) "_.keyFilter =" は _ オブジェクトにメソッドを追加しますが、_(myList) を使用して undescore オブジェクトを作成するためだと思います-これはチェーンが行うことです-それは別のオブジェクトです。

于 2013-03-02T21:01:15.757 に答える