ES5 a un énumérable drapeau. Exemple
Exemple
var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor
, pd = getOwnPropertyDescriptor(Object.prototype, "toString");
assert(pd.enumerable === false, "enumerability has the wrong value");
Une mise en œuvre partielle
Une mise en œuvre partielle est faisable en ayant Object.keys
et Object.getOwnPropertyNames
filtre de nouvelles non énumérable propriétés à l'aide de la calée Object.defineProperty
.
Introduction
Cela permet pour les propriétés non énumérable. Cela signifie clairement que Exemple
for (var key in {}) {
assert(key !== "toString", "I should never print");
}
Cela nous permet d'ajouter des propriétés à-dire Object.prototype
(Exemple)
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]"
Question
Comment pouvons-nous imiter cette non-ES5 compatible navigateurs?
Dans ce cas, nous nous soucions de potentiellement la résolution de ce pour
- IE < 9 (IE8 ne fonctionne que sur les objets DOM)
- Firefox 3.6
- Safari 4
- L'opéra de 11,5 (Opéra de 11,6 résout ce).
L' ES5-cale n'ont pas de solution pour cela.
L'ES5 shim a une solution pour la plupart des ES5 fonctionnalités qui va briser votre code si ça ne fonctionne pas.
Est-il de la magie noire qui peut être fait avec propiotory c'est à dire uniquement les Api? Peut-être avec VBScript?