2011-07-31 2 views
1

Object의 기능을 향상시키려는 동기는 단순히 데이터를 저장하는 개체 (예 : Java의 "hashmap")를 쉽게 처리 할 수 ​​있기를 원합니다. 나는 hashmap.size()를 쉽게하고 싶다.모든 개체에서 사용할 수있는 기능을 가진 개체 개체 늘리기

this.objData[key1name] = data1; 

과 :

var objData = {}; 

내 객체가이 같은 objData에 데이터를 추가 할 수있는 몇 가지 방법이 있습니다

은의 나의 목적은 다음과 같이 만들 때 비어 objData라는 속성을 가지고 있다고 가정 해 봅시다 내 개체도 objData에 액세스하는 몇 가지 방법을 가지고 있습니다.

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

물론 이러한 메서드는 없습니다 ists. 그래서 내 동기는 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; 
}; 

을 그리고 지금은 파이어 폭스에서 다음과 같은 오류 얻을 :

this.objData.getOwnPropertyCount is not a function 

나는 여기에 놓치고 무엇을?

답변

1

Object.prototype에서 직접 Object 생성자로 메서드를 이동하면이 메서드는 모든 개체의 프로토 타입 체인에서 더 이상 사용할 수 없습니다 (좋은 점은 BTW). 함수 인수를 제공하는 것이 좋습니다. 당신이 opearate하는 데 필요한 개체를 전달하고 메서드 호출 변경 : 구현에 분명히

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

그리고를, 당신은 this 때문에,에서 Object constructor에 참조되며, 전달 된 개체의 속성을 계산한다 위의 예.

+0

오른쪽. 감사. Crockford가 Object를 확장했을 때했던 "beget"정의를 읽었지 만 실제로 어떻게 사용했는지 확인하는 것을 잊어 버렸습니다 : p – achow

+0

하지만 Object.Prototype을 왜 늘리지 못합니까? – achow

+0

@ highwind7777, 이것은 많은 것들이 될 수 있습니다. 나는 당신의 페이지를 보지 않고 말할 수 없습니다. 대개는 for-in 문을 사용하는 스크립트입니다. for-in 문을 사용하여 * "반복"* 배열 객체 ... – CMS