我目前正在编写一个基于ES5新功能的JavaScript API。它非常广泛地使用Object.defineProperty
。我已将其包含在两个新函数中,称为Object.createGetSetProperty
和Object.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优雅地回退。
有没有人知道任何解决方案,垫片,填充剂?
答案 0 :(得分:6)
为清楚起见,您可能希望坚持使用标准术语并命名例程defineDataProperty
和defineAccessorProperty
。
此外,即使来电者传入错误,您的enumerable: enumerable || true
也会产生true
的价值......
无论如何,要了解手头的问题:你不能在IE8中这样做。据说defineProperty
在IE8中工作,但仅在DOM对象上工作。 IE7及以下版本有丑陋的黑客攻击,涉及在DOM对象上使用onpropertychanged
事件。所有这些都已在其他问题中详细介绍过,例如Cross-browser Getter and Setter,JavaScript getter support in IE8和其他许多问题。