2011-07-31 13 views
1

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

のは、私のオブジェクトはこのように作られたときに空だったobjDataと呼ばれる性質を持っているとしましょう:

var objData = {}; 

私のオブジェクトは、このようobjDataにデータを追加することができ、いくつかの方法があります。

this.objData[key1name] = data1; 

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

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

もちろん、このようなメソッドはありませんists。今、私はどちらか行うことができるはず

 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) 

か:だから、Objectオブジェクトを増強するための私のモチベーションだ

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 

私はここで何をしないのですか?

答えて

1

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

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

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

+0

。ありがとう。 CrockfordがObjectを増強したときに行った "beget"定義を読みましたが、彼が実際にどのように使用したかを確認するのを忘れました:p – achow

+0

なぜObject.Prototypeを増強できないのですか? – achow

+0

@ highwind7777、それは多くのことが原因である可能性があります。あなたのページを見ることなく、通常、for-inステートメントを使っていくつかのスクリプトを見ることなく、プロパティが* own * for-inステートメントを使って* "反復"する*配列オブジェクト... – CMS