web-dev-qa-db-fra.com

Object.create non pris en charge dans ie8

Je suis tombé sur un problème avec un plugin qui utilise object.create dans jQuery pour créer un menu déroulant de date. Je viens de remarquer dans IE 8 que cela génère une erreur de:

SCRIPT438: Object doesn't support property or method 'create'

Voici le code:

var dropdateobj = Object.create(dropdatefuncs);
dropdateobj.create(options, this);
$.data(this, 'dropdate', dropdateobj);

Qu'est-ce qui fonctionne bien pour IE8 ou plusieurs navigateurs compatibles?

Merci d'avance!

21
klye_g

Si vous avez besoin de Object.create, il y a de bonnes chances que vous deviez également vous fier aux autres fonctionnalités de es5. Par conséquent, dans la plupart des cas, la solution appropriée serait d'utiliser es5-shim .

Cependant, si Object.create est la seule chose dont vous avez besoin et que vous ne l'utilisez que pour configurer la chaîne de prototypes, voici un remplissage poly-remplissage léger qui ne prend pas en charge null comme premier argument ni le second argument properties.

Voici les spécifications:

15.2.3.5 Object.create (O [ Properties])

La fonction create crée un nouvel objet avec un prototype spécifié. Lorsque la fonction create est appelée, les étapes suivantes sont suivies:

Si Type (O) n'est pas Object ou Null, déclenche une exception TypeError.

Soit obj le résultat de la création d'un nouvel objet comme par l'expression New Object (), où Object est le constructeur intégré standard avec Avec ce nom.

Définissez la propriété [[Prototype]] internal de obj sur O.

Si l'argument Propriétés est présent et non indéfini, ajoutez vos propres propriétés À obj comme si vous appeliez la fonction intégrée standard Object.defineProperties avec les arguments obj et Properties.

Retour obj.

Voici l'implémentation légère:

if (!Object.create) {
    Object.create = function(o, properties) {
        if (typeof o !== 'object' && typeof o !== 'function') throw new TypeError('Object prototype may only be an Object: ' + o);
        else if (o === null) throw new Error("This browser's implementation of Object.create is a shim and doesn't support 'null' as the first argument.");

        if (typeof properties != 'undefined') throw new Error("This browser's implementation of Object.create is a shim and doesn't support a second argument.");

        function F() {}

        F.prototype = o;

        return new F();
    };
}
37
plalx

Il y a plusieurs cales qui fournissent ceci, y compris celui-ci .

Notez que Object.create ne peut pas être parfaitement ajusté, car entre autres choses, il peut créer des propriétés non énumérables ou des propriétés avec des getters et des setters, ce que vous ne pouvez pas faire avec toutes les tâches précédentes. Navigateurs ES5. (Vous pouvez créer des getters et des setters sur certains navigateurs antérieurs à ES5 en utilisant une syntaxe propriétaire, mais pas sur IE8, je ne crois pas.) Il ne peut s'agir que de pseudo-shimmed.

Mais un pseudo-shim conviendra au cas d'utilisation que vous avez cité.

Juste pour compléter, voici une version simple de la pièce qui peut être calée:

if (!Object.create) {
    Object.create = function(proto, props) {
        if (typeof props !== "undefined") {
            throw "The multiple-argument version of Object.create is not provided by this browser and cannot be shimmed.";
        }
        function ctor() { }
        ctor.prototype = proto;
        return new ctor();
    };
}
20
T.J. Crowder

Ceci fera fonctionner Object.create () dans IE 8.

J'ai essayé le shim/sham mais ça n'a pas fonctionné pour moi.

if (typeof Object.create !== 'function') {
 Object.create = function(o, props) {
  function F() {}
  F.prototype = o;

  if (typeof(props) === "object") {
   for (prop in props) {
    if (props.hasOwnProperty((prop))) {
     F[prop] = props[prop];
    }
   }
  }
  return new F();
 };
}
0
Sorter