我目前正在编写一个基于ES5新特性的JavaScript应用程序接口。它非常广泛地使用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优雅地后退。
有没有人知道有什么解决方案,填充物,填充物?
发布于 2013-07-01 00:30:23
为清楚起见,您可能希望坚持使用标准术语,并将例程命名为defineDataProperty和defineAccessorProperty。
此外,即使调用者传入false...,您的enumerable: enumerable || true也会产生一个true值。
无论如何,要深入到手头的问题:您不能在IE8中做到这一点。据说defineProperty可以在IE8中工作,但只能在DOM对象上工作。对于涉及在DOM对象上使用onpropertychanged事件的IE7和以下版本,有一些丑陋的技巧。所有这些都已经在其他问题中详细讨论过了,例如Cross-browser Getter and Setter、JavaScript getter support in IE8和许多其他问题。
https://stackoverflow.com/questions/17271224
复制相似问题