Object.defineProperty polyfill

时间:2013-06-24 08:39:04

标签: javascript ecmascript-5 es5-shim

我目前正在编写一个基于ES5新功能的JavaScript API。它非常广泛地使用Object.defineProperty。我已将其包含在两个新函数中,称为Object.createGetSetPropertyObject.createValueProperty

然而,我遇到了在旧版浏览器中运行此问题的问题(例如可怕的IE8)

请考虑以下代码:

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
        });
    }
};

正如您所看到的,在Object.createValueProperty下有一个优雅的回退,但我不知道如何使用Object.createGetSetProperty优雅地回退。

有没有人知道任何解决方案,垫片,填充剂?

1 个答案:

答案 0 :(得分:6)

为清楚起见,您可能希望坚持使用标准术语并命名例程defineDataPropertydefineAccessorProperty

此外,即使来电者传入错误,您的enumerable: enumerable || true也会产生true的价值......

无论如何,要了解手头的问题:你不能在IE8中这样做。据说defineProperty在IE8中工作,但仅在DOM对象上工作。 IE7及以下版本有丑陋的黑客攻击,涉及在DOM对象上使用onpropertychanged事件。所有这些都已在其他问题中详细介绍过,例如Cross-browser Getter and SetterJavaScript getter support in IE8和其他许多问题。