【问题标题】:Object.defineProperty polyfillObject.defineProperty 填充
【发布时间】:2013-06-20 17:00:50
【问题描述】:

我目前正在编写一个基于 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?

【问题讨论】:

标签: javascript ecmascript-5 es5-shim


【解决方案1】:

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

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

无论如何,回到手头的问题:您不能在 IE8 中执行此操作。据说defineProperty 在 IE8 中有效,但仅适用于 DOM 对象。 IE7 及以下版本存在丑陋的 hack,涉及在 DOM 对象上使用 onpropertychanged 事件。所有这些都在其他问题中进行了详细讨论,例如Cross-browser Getter and SetterJavaScript getter support in IE8 等等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-13
    • 2012-01-22
    • 2015-07-13
    • 2016-10-10
    • 2019-01-31
    • 2018-03-28
    相关资源
    最近更新 更多