Je veux pouvoir le faire:

var user1 = {
  name: 'John',
  gender: 'male'
}


var user2 = {
  name: 'James',
  gender: 'male',
  email: 'james@gmail.com'
}

user1.someSetMethod({email: 'john@gmail.com'});
user2.someSetMethod({name: 'Jenny', gender: 'female'});

Résultat souhaité:

var user1 = {
  name: 'John',
  gender: 'male',
  email: 'john@gmail.com'
}


var user2 = {
  name: 'Jenny',
  gender: 'female',
  email: 'james@gmail.com'
}

Je veux une méthode qui définira les attributs en fonction de ce qui est passé dans la fonction. Si l'attribut n'existe pas, je veux qu'il soit créé, si c'est le cas, je veux qu'il soit remplacé.

Existe-t-il une méthode comme celle-ci en Javascript?

5
wilsonpage 4 nov. 2011 à 16:43

3 réponses

Meilleure réponse

Cela s'appelle normalement étendre votre objet. Pratiquement chaque bibliothèque JavaScript a sa propre méthode pour ce faire. Ou vous pouvez écrire le vôtre en quelques lignes de code.

En utilisant la méthode de jQuery, vous le feriez comme ceci:

var user1 = {
  name: 'John',
  gender: 'male'
};

$.extend(user1, {
  email: 'john@gmail.com'
});

user1.email === 'john@gmail.com'; //true
6
John Strickler 4 nov. 2011 à 12:53

Si vous souhaitez utiliser jquery, vous pouvez utiliser sa méthode extend, ainsi que certaines valeurs par défaut qui garantiront que toutes les propriétés souhaitées sont définies correctement.

Quelque chose comme ça:

function whatever(obj1) {
    var defaults = {
        name: 'Foo Bar',
        email: 'email@example.com',
        gender: 'male'
    };

    return $.extend(defaults, obj1);
}
2
Malevolence 4 nov. 2011 à 12:51

Non, tu ne veux pas faire ça.

La seule façon d'ajouter une méthode à tous les objets est d'étendre Object.prototype.

Cela (dans les navigateurs ES3 comme IE8) a pour conséquence d'ajouter des propriétés aux énumérations.

Par exemple:

Object.prototype.extend = function (o) {
  // clone properties of o into this
};

var someObj = {};
for (var key in someObj) {
  console.log(key); // "extend"
}

Le mieux que vous puissiez faire est d’utiliser Object.extend

Object.extend(user2, {
  name: "Jenny",
  gender: "female"
});

pd a une implémentation de extend ou vous pouvez utiliser:

Object.extend = function (target, source) {
  for (var key in source) {
    target[key] = source[key];
  }
};
3
Raynos 4 nov. 2011 à 12:46
8009336