Objet.créer n'est pas encore la norme sur plusieurs navigateurs, par exemple, IE8, Opera v11.5, Konq 4.3 ne pas l'avoir. Vous pouvez utiliser Douglas Crockford de la version de l'Objet.créer pour les navigateurs, mais cela ne comprend pas le second " initialisation de l'objet du paramètre utilisé dans les CMS de réponse.
Pour la croix-navigateur de code une façon d'obtenir de l'initialisation des objets dans l'intervalle est de personnaliser Crockford de l'Objet.créer. Voici une méthode:-
Object.build = function(o) {
var initArgs = Array.prototype.slice.call(arguments,1)
function F() {
if((typeof o.init === 'function') && initArgs.length) {
o.init.apply(this,initArgs)
}
}
F.prototype = o
return new F()
}
Cela maintient Crockford prototypes de l'héritage, et vérifie également pour toute méthode init de l'objet, puis l'exécute avec votre paramètre(s), comme, disons, l'homme nouveau('Jean','Dupont'). Votre code devient alors:-
MY_GLOBAL = {i: 1, nextId: function(){return this.i++}} // For example
var userB = {
init: function(nameParam) {
this.id = MY_GLOBAL.nextId();
this.name = nameParam;
},
sayHello: function() {
console.log('Hello '+ this.name);
}
};
var bob = Object.build(userB, 'Bob'); // Different from your code
bob.sayHello();
Alors, bob hérite de la méthode sayHello et a maintenant propres propriétés id=1 et nom='Bob'. Ces propriétés sont à la fois l'écriture et énumérable de cours. C'est aussi un moyen beaucoup plus simple pour initialiser que pour l'ECMA Objet.créer surtout si vous n'êtes pas préoccupé par l'écriture, la énumérable et attributs configurables.
Pour l'initialisation sans une méthode init suivantes Crockford mod pourrait être utilisé:-
Object.gen = function(o) {
var makeArgs = arguments
function F() {
var prop, i=1, arg, val
for(prop in o) {
if(!o.hasOwnProperty(prop)) continue
val = o[prop]
arg = makeArgs[i++]
if(typeof arg === 'undefined') break
this[prop] = arg
}
}
F.prototype = o
return new F()
}
Cela remplit le userB propres propriétés, dans l'ordre qu'ils sont définis à l'aide de l'Objet.gen paramètres à partir de la gauche vers la droite après la userB paramètre. Il utilise le pour(prop o) boucle afin que, par l'ECMA normes, l'ordre de la propriété énumération ne peut pas être garanti le même que l'ordre de définition de propriété. Cependant, plusieurs exemples de code testé sur (4) les principaux navigateurs montrer qu'ils sont les mêmes, à condition que le hasOwnProperty filtre est utilisé, et parfois, même si ce n'.
MY_GLOBAL = {i: 1, nextId: function(){return this.i++}}; // For example
var userB = {
name: null,
id: null,
sayHello: function() {
console.log('Hello '+ this.name);
}
}
var bob = Object.gen(userB, 'Bob', MY_GLOBAL.nextId());
Un peu plus simple, je dirais que l'Objet.en construction depuis userB n'a pas besoin d'une méthode init. Aussi userB n'est pas spécifiquement un constructeur, mais ressemble à un objet singleton. Donc, avec cette méthode, vous pouvez construire et l'initialisation de la normale objets simples.