Personne n'a vraiment expliqué pourquoi il ne fonctionne pas. Si nous regardons au plus tard spec, l' Object
fonction est définie comme suit:
19.1.1.1 Object ( [ valeur ] )
Lors de l' Object
fonction est appelée avec un argument optionnel value
, les mesures suivantes sont prises:
- Si
NewTarget
n'est ni undefined
ni la fonction active, alors
- De retour ?
OrdinaryCreateFromConstructor(NewTarget, "%ObjectPrototype%")
.
- Si
value
est null
, undefined
ou n'est pas fourni, le retour ObjectCreate(%ObjectPrototype%)
.
- De retour !
ToObject(value)
.
La première étape est le plus important ici: NewTarget
se réfère à la fonction qu' new
a été appelé. Donc, si vous n' new Object
, il sera Object
. Si vous appelez new ExtObject
il ExtObject
.
Parce qu' ExtObject
n'est Object
("ni la fonction active"), la condition est satisfaite et OrdinaryCreateFromConstructor
est évaluée et son résultat retourné. Comme vous pouvez le voir, rien n'est fait avec l' value
passés à la fonction.
value
n'est utilisé que si ni 1. ni 2. sont remplies. Et si value
est un objet, il est tout simplement rendu comme tel, pas de nouvel objet est créé. Donc, new Object(objectValue)
est en fait le même que Object(objectValue)
:
var foo = {bar: 42};
console.log(new Object(foo) === foo);
console.log(Object(foo) === foo);
En d'autres termes: Object
ne permet pas de copier les propriétés de l'objet, il retourne simplement l'objet tel qu'il est. Afin d'étendre Object
ne serait pas copier les propriétés.