4

文字列などの標準オブジェクトをプロトタイプで拡張したい。たとえば、配列のdiff関数を追加します。Node.jsのコードを整理する良い方法はモジュールですが、これをプロトタイプでどのように行うのでしょうか?

Array.prototype.diff = function (a) {
    return this.filter(function (i) {
        return !(a.indexOf(i) > -1);
    });
};
4

3 に答える 3

4

nodejsについて話すことはできませんが、MozillaのJSモジュールは似ていると思いますが、そこで同じ問題が発生したことがあります。

つまり、各JSモジュール(およびおそらくnodejsモジュールも)は独自のJavaScriptコンテキストで実行されるため、異なるモジュールの配列コンストラクター(およびプロトタイプ)は同じではありません。それらは完全に異なるオブジェクトです。

私はおそらく、与えられたオブジェクトに応じた変更を追加するヘル​​パー関数を備えたモジュールを持っているでしょう。ただし、これは、拡張配列プロトタイプを使用するすべてのモジュール内からヘルパー関数を呼び出す必要があることを意味します。

ArrayHelperModule:

function extendArray(arrayConstructor)
{
    arrayConstructor.prototype.diff = function (a) {
      return this.filter(function (i) {
        return !(a.indexOf(i) > -1);
      });
    };
}

exports.extendArray = extendArray;

配列を使用するモジュール:

var ArrayHelperModule = require("ArrayHelperModule");

// extending the Array of this module
ArrayHelperModule.extendArray(Array);

// use it
var diff = [1, 2].diff([1]);

psは、コードがこのように正しいことを願っています...私はここにすばやく入力しました

于 2012-08-08T11:30:41.643 に答える
0

これは私のために働いた。

Array.prototype.diff = function( compareArray ) {
    return this.filter(
        function( arrayItem ){
            return this.indexOf( arrayItem ) == -1;
        },
        compareArray
    );
};

プロトタイプチェーンにレベルを追加することもできますが、それはより複雑なものを必要とし、まだそれほど有用ではないようです。

追伸:フィルター機能の使用をどのように計画していたのかわかりません。

var a = [1,2,3,4];
var b = [3,4,5,6];
console.log( a.diff( b ) );

// Outputs:
[ 1, 2 ]
于 2012-08-08T11:33:46.837 に答える
-2

**ランクが低いため、コメントできません:(だから答えを書いています

ネイティブオブジェクトを拡張することは非常に悪い習慣です。これは絶対に避けてください。Mootoolsはこのアプローチを採用しており、「mootoolsの衝突」をグーグルで検索して、発生し続ける問題を確認してください。バージョン1.2.4以降、Mootoolsから離れています。

別のライブラリがネイティブオブジェクトを拡張するとすぐに(マッピング、グラフィックライブラリは過去の経験からこれを行うことがあります)、それらの追加から異なる動作を期待する異なるコードを取得します。

つまり、これらの関数を格納する別の「ユーティリティ」クラスを作成し、代わりにそれを含めて使用します。

于 2012-08-09T12:38:46.043 に答える