J'en ai marre de devoir toujours écrire du code comme celui-ci:
function shallowExtend(obj1,obj2){
var key;
for ( key in obj2 ) {
if ( obj2.hasOwnProperty(key) === false ) continue;
obj1[key] = obj2[key]
}
}
Ou si je ne veux pas écrire le code moi-même, implémentez une bibliothèque qui le fait déjà. ES6 + vient sûrement à la rescousse, cela nous fournira quelque chose comme un Object.prototype.extend(obj2...)
ouObject.extend(obj1,obj2...)
Est-ce que ES6 + fournit une telle fonctionnalité? Si ce n'est déjà fait, une telle fonctionnalité est-elle prévue? Si ce n'est pas prévu, pourquoi pas?
javascript
ecmascript-6
balupton
la source
la source
[[Prototype]]
chaîne? Faites-vous des copies «profondes» ou «superficielles»? Qu'en est-il des propriétés non énumérables et non inscriptibles? Je pense que je préfère avoir une petite fonction de bibliothèque qui fait ce dont j'ai besoin, et qui est surtout évitable de toute façon.Réponses:
Vous pourrez effectuer une fusion / extension / affectation superficielle dans ES6 en utilisant Object.assign:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
Syntaxe:
où ... sources représente le ou les objets source.
Exemple:
la source
let merged = Object.assign({}, source1, source2);
Object.assign
: voir ma réponse iciJSON.parse(JSON.stringify(src))
Vous pouvez utiliser la syntaxe de propagation d'objets pour cela:
Pour les tableaux, l'opérateur de propagation faisait déjà partie de ES6 (ES2015), mais pour les objets, il a été ajouté à la spécification du langage à ES9 (ES2018). Sa proposition a été activée par défaut dans des outils comme Babel bien avant cela.
la source
const ob1 = {foo: 123}; const ob2 = {bar: 234}; const merged = {...ob1, ...ob2}; console.log(merged)
Sortie:{ foo: 123, bar: 234 }
Je sais que c'est un peu un vieux problème, mais la solution la plus simple dans ES2015 / ES6 est en fait assez simple, en utilisant Object.assign (),
Espérons que cela aide, cela permet également de fusionner DEEP :
Exemple d'utilisation:
la source
L'ajout de
Object.mixin
est actuellement en discussion pour prendre en charge le comportement que vous demandez. https://mail.mozilla.org/pipermail/es-discuss/2012-December/027037.htmlBien que ce ne soit pas encore dans le projet ES6, il semble qu'il y ait beaucoup de soutien pour cela, donc je pense qu'il apparaîtra bientôt dans les projets.
la source
.mixin
a été abandonné par TC39.ES6
ES7 ou Babel
la source
Peut-être que la
Object.defineProperties
méthode ES5 fera l'affaire?par exemple
Documentation MDN: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperties
la source
defineProperties
définit ses propres propriétés. Il n'écrase pas les propriétés de la[[prototype]]
chaîne, il les masque.Object.getOwnPropertyDescriptor
également pour définir la propriété lorsqu'il s'agit d'une valeur complexe, ou vous copierez par référence.