2013-06-24 2 views
3

현재 ES5의 새로운 기능을 기반으로하는 JavaScript API를 작성 중입니다. 그것은 광범위하게 Object.defineProperty을 사용합니다.Object.defineProperty polyfill

Object.createGetSetProperty = function (object, property, get, set, enumerable, configurable) { 
    if (!Object.defineProperty) throw new Error("Object.defineProperty is not supported on this platform"); 
    Object.defineProperty(object, property, { 
     get: get, 
     set: set, 
     enumerable: enumerable || true, 
     configurable: configurable || false 
    }); 
}; 

Object.createValueProperty = function (object, property, value, enumerable, configurable, writable) { 
    if (!Object.defineProperty) { 
     object[property] = value; 
    } else { 
     Object.defineProperty(object, property, { 
      value: value, 
      enumerable: enumerable || true, 
      configurable: configurable || false, 
      writable: writable || false 
     }); 
    } 
}; 
: 나는 그러나 다음 코드를 고려 (예 : 두려워, IE8로) 이전 버전의 브라우저에서이 작업을 실행하는 데 문제

을 경험하고 Object.createGetSetPropertyObject.createValueProperty

나는 두 가지 새로운 기능으로이 포장 불렀다

보시다시피, Object.createValueProperty 아래에 우아한 fallback이 있지만 Object.createGetSetProperty를 사용하여 정상적으로 폴백하는 방법을 알지 못합니다.

누구에게도 해결책이 무엇인지, shims, polyfills에 대해 알고 있습니까?

+2

https://github.com/kriskowal/es5-shim – kangax

+0

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperties, 끝에 폴리 폴리을 설명합니다. 페이지의 –

답변

4

표준 용어를 사용하고 루틴의 이름을 defineDataPropertydefineAccessorProperty으로 지정하고자 할 수 있습니다. 또한

, 당신의 enumerable: enumerable || true는 발신자가 거짓에 통과하더라도 true의 값을 초래할 것입니다 ...

어쨌든

, 손 질문에 내려합니다 : 당신이 IE8에서이 작업을 수행 할 수 없습니다 . defineProperty은 IE8에서 작동하지만 DOM 객체에서만 작동한다고합니다. DOM 개체에 onpropertychanged 이벤트를 사용하는 것과 관련하여 IE7 이하 버전에 대한 추악한 해킹이 있습니다. 이 모든 것들은 Cross-browser Getter and Setter, JavaScript getter support in IE8 및 기타 많은 질문에서 자세히 다루어졌습니다.

관련 문제