1

크로스 브라우저에서 작동하는 JavaScript 개체에 "숨겨진"비가 열 속성을 추가하는 방법이 있습니까?IE8 용 JavaScript에서 열거되지 않는 속성을 추가하는 방법은 무엇입니까?

가장 현대적인 브라우저의 경우, 당신은 할 수 있습니다 : Object.defineProperty이없는 일부 오래된 비 IE 브라우저의 경우

Object.defineProperty(obj, '__id__', { enumerable: false, value: id++ }); 

, 당신은 the __proto__ hack를 사용할 수 있습니다.

그러나 이들 중 어느 것도 IE에서 작동하지 않습니다. IE8에서이 작업을 수행 할 수있는 방법이 있습니까 (IE7도 좋지만 필수는 아닙니다.).

주요 목표는 모든 JavaScript {} 개체에 추적기 속성을 추가 할 수 있지만 JSON.stringify(obj)을 호출하면 속성에 포함되지 않도록하는 것입니다. 사용자 정의 JSON replacer 함수 (기본적으로 JSON.stringify 기능 확장)를 추가 할 수 있다는 것을 알았지 만, 추적 된 JavaScript 객체를 JSON으로 직렬화 할 때마다이를 의미하기 때문에 큰 팬이 아닙니다. 추가/추가해야한다는 것을 알고 있어야합니다. 그 대체 기능은 꽤 비실용적입니다.

이 작업을 수행 할 수있는 방법이 있습니까?

+0

당신은 IE8 +라고하지만 IE9에서는'Object.defineProperty()'가 작동하지 않습니까? – nnnnnn

+0

오, 그래, IE8을 의미하는 것 같아. IE7을 지원하는 방법이 있다면 정말 멋지 겠지만 기본적으로 IE8에서 어떻게 할 것인가. 업데이트 된 질문. –

답변

2

IE8의 호환성 모드에서 IE8에서 재현 할 수 없지만 같은 속성을 정의하는 은 the don't enum bug in IE8 때문에 작동해야합니다. 또한 이들과 같은 "isPrototypeOf" 또는 "propertyIsEnumerable"를 사용할 수

var uniqueId = function() { 
    var dontEnumBug = false; 
    var id = 0; 

    if(!Object.defineProperty) { 
     var keyVisited = false; 
     for(var k in {toLocaleString: 3}) { 
      if(k === "toLocaleString") { 
       keyVisited = true; 
      } 
     } 
     if(!keyVisited) { 
      dontEnumBug = true; 
     } 
    } 

    return function(obj) { 
     if(dontEnumBug) { 
      obj.toLocaleString = id++; 
     } 
     else { 
      Object.defineProperty(obj, '__id__', { enumerable: false, value: id++ }); 
     } 

    } 

})(); 

도 꽤 많이 호출되지 않습니다 기능입니다.

+0

아 아름다운! 이것은 완벽하다, 고마워요 :) –

+0

@ LancePollard 나는 버그가 있다고 생각한다 ..이 코드를 사용하지 마라. ok lol – Esailija

+0

하하 소리가 좋다. –

관련 문제