ES5 имеет перечислимый флаг. Пример
Пример
var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor
, pd = getOwnPropertyDescriptor(Object.prototype, "toString");
assert(pd.enumerable === false, "enumerability has the wrong value");
Частичная реализация
Частичная реализация делает невозможным, если Object.keys
и Object.getOwnPropertyNames
отфильтровывать новые неперечислимые свойства с помощью shimmed Object.defineProperty
.
Введение
Это позволяет неперечислить свойства. Это явно означает, что Пример
for (var key in {}) {
assert(key !== "toString", "I should never print");
}
Это позволяет нам добавлять свойства, чтобы сказать Object.prototype
(Пример)
Object.defineProperty(Object.prototype, "toUpperCaseString", {
value: function toUpperCaseString() {
return this.toString().toUpperCase();
},
enumerable: false
});
for (var key in {}) {
assert(key !== "toUpperCaseString", "I should never print");
}
console.log(({}).toUpperCaseString()); // "[OBJECT OBJECT]"
Вопрос
Как мы можем эмулировать это в браузерах, не поддерживающих ES5?
Таблица сопоставлений браузера
В этом случае мы заботимся о потенциальном решении этого вопроса для
- IE < 9 (IE8 работает только с объектами DOM)
- Firefox 3.6
- Safari 4
- Opera 11.5 (Opera 11.6 разрешает это).
ES5-shim не имеет решения для этого.
В ES5 shim есть решение для большинства функций ES5, которые сломают ваш код, если он не работает.
Есть ли какая-либо черная магия, которую можно сделать с помощью пропиоровых IE только API? Может быть, с VBScript?