5

我目前正在编写一个基于 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 优雅地回退。

有谁知道任何解决方案,垫片,polyfills?

4

1 回答 1

6

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

此外,即使调用者传入 false ,您enumerable: enumerable || true的值也会产生...true

无论如何,要解决手头的问题:您不能在 IE8 中执行此操作。据说它defineProperty适用于 IE8,但仅适用于 DOM 对象。IE7 及以下版本有一些丑陋的 hack,涉及onpropertychanged在 DOM 对象上使用事件。所有这些都在其他问题中进行了详细讨论,例如跨浏览器 Getter 和 SetterIE8 中的 JavaScript getter 支持以及许多其他问题。

于 2013-06-30T16:30:22.637 回答