gpt4 book ai didi

javascript - Object.defineProperty polyfill

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:25:51 29 4
gpt4 key购买 nike

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

有人知道这方面的任何解决方案、垫片、polyfill 吗?

最佳答案

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

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

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

关于javascript - Object.defineProperty polyfill,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17271224/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com