un nouvel objet créé à partir d’un objet entièrement personnalisé (en particulier celui créé à partir de l’objet null
, qui est essentiellement un objet personnalisé sans membres) peut se comporter de manière inattendue. Cela est particulièrement vrai lors du débogage, car les fonctions utilitaires de conversion/détection de propriétés d’objet communes peuvent générer des erreurs ou perdre des informations (en particulier si vous utilisez des pièges d’erreur silencieux qui ignorent les erreurs). Par exemple, voici deux objets:
Comme indiqué ci-dessus, tout semble normal jusqu’à présent., Cependant, lorsque vous essayez d’utiliser réellement ces objets, leurs différences deviennent rapidement apparentes:
> "oco is: " + oco // shows "oco is: "> "ocn is: " + ocn // throws error: Cannot convert object to primitive value
tester quelques-unes des nombreuses fonctions intégrées les plus basiques montre plus clairement l’ampleur du problème:
Comme dit, ces différences peuvent faire en sorte que le débogage, même les problèmes apparemment simples, s’égarent rapidement. Par exemple:
Une simple fonction de débogage commune:
résultats pas si simples: (surtout si le piégeage silencieux des erreurs avait caché les messages d’erreur)
(Mais si le même objet est créé dans un ordre différent — au moins dans certaines implémentations.,..)
notez qu’un tel ordre différent peut survenir statiquement via des codages fixes disparates comme ici, mais aussi dynamiquement quel que soit l’ordre dans lequel une telle propriété-ajout de branches de code est réellement exécutée à l’exécution car cela dépend des entrées et / ou des variables aléatoires. Là encore, l’ordre d’itération réel n’est pas garanti, quels que soient les membres de l’ordre ajoutés.
Être conscient, aussi, que l’utilisation de l’Objet.entrées() sur un objet créé par l’Objet.create () entraînera le retour d’un tableau vide.,
var obj = Object.create({ a: 1, b: 2 });> console.log(Object.entries(obj)); // shows ""
quelques NON-solutions
Une bonne solution pour les méthodes d’objet manquantes n’est pas immédiatement apparente.,
ajouter la méthode objet manquante directement à partir de l’objet standard ne fonctionne pas:
ajouter la méthode objet manquante directement au « prototype » du nouvel objet ne fonctionne pas non plus, car le nouvel objet n’a pas de véritable prototype (ce qui est vraiment la cause de tous ces problèmes) et on ne peut pas être ajouté directement:
ajouter la méthode objet manquante en utilisant l’objet standard comme prototype du nouvel objet ne fonctionne pas non plus:
quelques solutions OK
encore une fois, l’ajout de la méthode objet manquante directement à partir de l’objet standard ne fonctionne pas., Cependant, en ajoutant directement la méthode générique, fait:
cependant, définir le prototype générique comme prototype du nouvel objet fonctionne encore mieux:
(en plus de toutes les fonctions liées aux chaînes montrées ci-dessus, cela ajoute également:)
comme indiqué, les objets modifiés de cette façon ressemblent maintenant beaucoup à des objets ordinaires.