31 votes

Est-il possible d'imiter des propriétés non-enumerables ?

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?

Navigateur compat table

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?

3voto

Mike Samuel Points 54712

Vous pouvez le faire via le code de réécriture. Réécrire chaque utilisation de l' for (p in o) body de

for (p in o) {
  if (!(/^__notenum_/.test(p) || o['__notenum_' + p])) {
    body
  } 
}

et puis vous pouvez marquer les propriétés non énumérable par la définition d'un __notenum_... de la propriété. Pour être compatible, vous devez l'ajuster la ci-dessus pour vous assurer qu' __notenum_propname est définie dans le même prototype niveau propname, et si vous les utilisez, écraser eval et new Function à réécrire.

C'est en gros ce que ES5/3 ne.

-1voto

ArifHussain Points 753

Partial.js de Jake Verbaten est la réponse.

Le partial.js est le suivant

J'espère que cela aide les gars à la recherche de ce correctif.

-2voto

DotNetWise Points 2237

Si vous vous souciez beaucoup de IE8/IE7 alors vous pouvez faire

Il n'y a pas de véritable alternative "hack", mais cela pourrait être une solution de contournement pour les cas simples

La réponse acceptée ne fonctionne pas vraiment pour les littérals, c'est-à-d. les cordes, les `` chiffres, ou les booléens

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X