2016-10-20 1 views
2

objets réguliers peuvent être clonés en utilisant cette méthode:JavaScript Object.assign ne fonctionne pas sur l'objet Date

a = {x:9}; //sample 
b = Object.assign(Object.create(a),a); 
console.log(a); 
console.log(b); 

Cependant, les variables de type Date ne semblent pas travailler avec Object.assign et Object.create:

a = new Date(); 
b = Object.assign(Object.create(a),a); 
console.log(a); 
console.log(b); 

/* 
Results of printing a, b are not the same: 
a: 
Thu Oct 20 2016 11:17:29 GMT+0700 (SE Asia Standard Time) 
b: 
Date {} 
*/ 

Je sais que je peux créer un clone de date objet d'une autre manière en utilisant

b = new Date(a) 

Mais pourquoi Obje ct.assign et Object.create ne fonctionnent pas sur le type Date?

+0

Qu'est-ce qui vous attend? Quelles propriétés de l'objet Date source pensez-vous être copié? – Pointy

+0

toutes ses propriétés – johnlowvale

+2

Bien, il ** copie ** sur toutes les propriétés * enumerable * et * own *. C'est juste qu'une instance de Date n'en a pas. – Pointy

Répondre

4

Les copies de méthode Object.assign() sur les dénombrable et propres propriétés de l'objet source. Une instance de Date n'en a vraiment aucune (si vous n'en ajoutez aucune avec votre propre code).

En particulier, les "propriétés" Date comme l'année, le mois, la date, etc. ne sont pas des propriétés au sens de JavaScript. Ce sont des valeurs qui peuvent être récupérées via l'API. Cela ne les rend pas propriétés.

+0

hm, JS est drôle, il semble qu'une instance de type Date a des propriétés "natives" non accessibles par le code JS – johnlowvale

+1

@johnlowvale oui, cela relève entièrement de la compétence des éléments natifs, bien que le code JavaScript pur peut avoir des façons de le faire aussi . Les propriétés de l'objet sont présentes en tant que propriétés sur l'objet, et comme vous pouvez le voir dans la [documentation MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date) ne sont vraiment pas sur une instance de Date. – Pointy

+0

Mieux vaut faire référence à [* ECMA-262 *] (http://ecma-international.org/ecma-262/7.0/index.html#sec-properties-of-date-instances). Les instances de date par défaut ont une propriété interne (leur valeur d'heure, accessible via * getTime *) et aucune propriété. – RobG