0

そのオブジェクトのインスタンスを作成するときに何かを行うようにprototype、事前定義されたオブジェクト (たとえば) のを操作するにはどうすればよいですか?Array

alert('an array was created!')単純に、配列がインスタンス化されるたびにそうしたいのです。

4

3 に答える 3

3

Array.prototypeオブジェクトに追加することで、配列に新しいメソッドを設定できます。

Array.prototype.fizz = function () {
    alert('works');
};

var arr = [];
arr.fizz();

ただし、これは新しいメソッドを作成することのみを許可し、既存のメソッドを拡張することはできません *、Arrayコンストラクターをオーバーライドすることもできません。

新しいメソッドを既存の型に追加する場合は注意してください。これは、スクリプト環境全体に悪影響を及ぼし、一部のライブラリで予期しない動作を引き起こす可能性があります。これを「悪い習慣」と呼ぶ人もいるかもしれませんが、Array.prototype.indexOf.

「新しい」配列のようなものはありません。単語は「インスタンス化」されています。

var a1, a2;
a1 = []; //a1 was instantiated with a new Array
a2 = new Array(); //a2 was also instantiated with a new Array

Arrayコンストラクターをオーバーライドするクロスブラウザーの手段はありません。

* 既存のメソッドを関数でラップして、呼び出されたときに既存のメソッドが新しい機能に加えて元の機能を実行するようにすることができます。これは既存のメソッドの拡張と呼ばれることもありますが、実際には新しいメソッドを作成しています。

于 2012-08-30T20:57:58.537 に答える
2

Array独自の関数でオーバーライドを試みることができます。をしているときはうまくいくように見えますが、しているときはそうnew Arrayではありません[]

(function() {
    var _ac = Array;
    Array = function() {
        alert('an array was newed!');
        return _ac.apply(this, arguments);
    };
}());

デモ: http://jsfiddle.net/DAg9A/

于 2012-08-30T21:00:48.503 に答える
1

そのための配列名前空間を作成することをお勧めします。

array = {};
array.create = function() {

    alert("Created an array");     
    return [];

}

したがって、配列を作成するときはいつでも次を使用します。.

ネイティブ機能を変更すべきではなく、この場合は変更できません。すべてのアレイの作成を担当する必要があります。

于 2012-08-30T21:06:03.060 に答える