1

Object の拡張に対する私の動機は、単純にデータを格納することを目的としたオブジェクト (Java の「ハッシュマップ」など) を簡単に処理できるようにしたいということです。hashmap.size()を簡単にやりたい。

私のオブジェクトには、次のように作成されたときに空だった objData というプロパティがあるとしましょう:

var objData = {};

私のオブジェクトには、次のように objData にデータを追加できるメソッドがいくつかあります。

this.objData[key1name] = data1;

また、私のオブジェクトには、objData にアクセスするいくつかのメソッドもあります。

if(this.objData.size() == 0):

もちろん、そのような方法は存在しません。これが、Object オブジェクトを拡張する私の動機です。

        Object.prototype.getOwnPropertyCount = function ( ) {
            var count = 0;
            for(var item in this) {
                if (this.hasOwnProperty(item)) {
                    count += 1;
                }
            }
            return count;
        };

これで、次のいずれかを実行できるはずです。

if (this.objData.getOwnPropertyCount() == 0)

また:

if(!objData.getOwnPropertyCount())

しかし、実際には、私が書いたコードとはまったく関係のないページを読み込もうとすると、エラーが発生します。Google マップ API の main.js でエラーがスローされます。ブードゥー。

そこで、Object.prototype ではなく実際のオブジェクトを拡張するように拡張を変更します。

Object.getOwnPropertyCount = function ( ) {
    //calculate the count
    return count;
};

そして今、Firefoxで次のエラーが発生します。

this.objData.getOwnPropertyCount is not a function

ここで何が欠けていますか?

4

1 に答える 1

1

メソッド宣言をコンストラクターにObject.prototype直接移動するObjectと、メソッドはすべてのオブジェクトのプロトタイプ チェーンで使用できなくなります (これは良いことです)。必要なオブジェクトを渡すために、関数に引数を指定することをお勧めします。操作し、メソッド呼び出しを変更します。

// from `this.objData.getOwnPropertyCount()` to:
Object.getOwnPropertyCount(this.objData);

そして明らかに、実装では、渡されたオブジェクトのプロパティをカウントする必要があります。これは、上記の例では がコンストラクタthisを参照するためです。Object

于 2011-07-31T21:10:59.067 に答える