Object.defineProperty dans ES5?

Je vois des articles sur un 'nouvel objet.creat qui rend l'énumération configurable. Cependant, il repose sur une méthode Object.defineProperty. Je ne peux pas trouver une implémentation cross browser pour cette méthode.

Sommes-nous écrits collés pour l'ancien Object.create? Je ne peux pas écrire des choses qui ne fonctionneront pas dans IE6 / 7.

    Il y a plusieurs choses que vous ne pouvez pas imiter à partir de la méthode Object.create ECMAScript sur un environnement ECMAScript 3.

    Comme vous l'avez vu, l'argument des propriétés vous donnera des problèmes car, dans les implémentations basées sur E3, il n'y a aucun moyen de modifier les attributs de la propriété.

    La méthode Object.defineProperty telle que mentionnée par @Raynos , fonctionne sur IE8, mais en partie , elle ne peut être utilisée que dans les éléments DOM.

    De plus , les propriétés de l'accessoire vous poseront des problèmes, elles pourraient être imitées avec des méthodes non standard largement supportées telles que __defineGetter__ / __defineSetter__ , mais encore une fois, vous ne pouvez pas modifier les attributs de la propriété .

    Un autre problème mis à part les descripteurs de propriété, c'est que la méthode Object.create peut accepter null comme argument, créer un objet qui ne hérite de rien.

    Cela ne peut pas être imité avec la Object.create de Crockford , car lorsque le new opérateur est utilisé avec une fonction de constructeur ayant un prototype propriété contenant null ou toute autre valeur non objet, l'objet nouvellement créé héritera d' Object.prototype toute façon par défaut.

    Dans certaines implémentations – V8, Spidermonkey, Rhino, etc … – ils ont une propriété __proto__ pouvant être utilisée pour pouvoir définir un null [[Prototype]], mais encore une fois, ce n'est pas standard et pour sûr que ça ne fonctionnera jamais Sur IE.

    Je recommanderais, si vous souhaitez cibler les anciens navigateurs pour ne pas utiliser ces fonctionnalités, car il n'y a aucun moyen de les faire fonctionner correctement sur ces environnements.

    Si vous souhaitez toujours utiliser Object.create , sans utiliser l'argument de propriétés , vous pourriez, mais je vous recommanderais de détecter les éléments qui ne peuvent pas être imités.

    Ce qui suit serait une version plus sûre de la Object.create d' Object.create de Crockford .

     if (typeof Object.create != 'function') { (function () { var F = function () {}; Object.create = function (o) { if (arguments.length > 1) { throw Error('Second argument not supported');} if (o === null) { throw Error('Cannot set a null [[Prototype]]');} if (typeof o != 'object') { throw TypeError('Argument must be an object');} F.prototype = o; return new F; }; })(); } 

    Quoi qu'il en soit, utilisez-le avec précaution.

    Si vous voulez une bonne implémentation defineProperty (), consultez https://github.com/kriskowal/es5-shim

    Malheureusement, vous ne pouvez pas faire l'énumération configurable dans un environnement ES3. Cette cale vous permettra d'appeler l'API dans l'un ou l'autre environnement, mais les propriétés seront toujours énumérées sous ES3.

    Pour ce qu'il vaut,

    Object.defineProperty fonctionne dans ie8 et FF4.

    Cela signifie qu'il vaut la peine de détecter le reniflement et de l'implémenter là où il est utile de voir que vous voudriez que la mise à niveau soit de 6/7 à 8/9 se produira au cours des prochaines années.

    Une autre chose à se méfier est que la propriété dontEnum a un bug dans JScript

    Vous devrez contourner la façon dont vous utilisez la propriété dontEnum dans IE.

    [Modifier]:

    Voici la documentation pour Internet Explorer et un lien vers la spécification ES5 (Page 122, 15.2.3.6)