2013-03-10 3 views
0

Je m'attendais à ce que le code suivant fonctionne - je voulais un clone qui n'était pas récursif.Mot-clé "nouveau" lors du clonage d'un objet dans JS

Il n'a pas ...

Pourquoi et que puis-je faire pour contourner?

person=new Object(); 
person.firstname="John"; 
person2 = new person; //Expected a new person object with firstname john  

"TypeError: object is not a function" 

et la même pour

person2 = new person() 
+0

'new' est utilisé sur une fonction constructeur et clone son objet' prototype'. Mai aussi bien écrire votre propre fonction de clonage ... – Ryan

+0

Bah, j'ai sur simplifié ma question. – Alex

+0

Si vous avez besoin d'explications détaillées sur le modèle d'objet Javascript, je vous suggère de lire [Javascript Garden] (http://bonsaiden.github.com/JavaScript-Garden/). Tout sur les objets, le prototype, les constructeurs et l'héritage est expliqué. –

Répondre

3

L'opérateur new en Javascript est appliqué à une fonction pour créer un nouvel objet qui fonctionne avec chaîne prototype appliquée sur le nouvel objet. Vous ne pouvez pas l'appliquer directement à un objet.

Si vous voulez cloner un objet en javascript, ce n'est pas un processus simple. Vous pouvez voir cette réponse pour une liste de possibilités: How do I correctly clone a JavaScript object?. La méthode la plus simple consiste à utiliser jQuery et $ .extend. Mais vous pouvez également écrire une solution Javascript commune. Si vous voulez seulement l'utiliser pour un type spécifique d'objet, cela peut être assez simple.

Si vous souhaitez utiliser un nouveau correctement, vous pouvez créer une fonction constructeur comme celui-ci

var Person = function() { 
this.firstname = "John"; 
}; 
var person1 = new Person(); 
var person2 = new Person(); 

Cela va créer 2 nouveaux objets Person, indépendants les uns des autres.

1
var Person = function() { 
this.firstname = 'John'; 
}; 

person2 = new Person(); 

L'erreur jetée vous fournit des informations précieuses (une rareté en JavaScript, bien sûr) - vous ne pouvez utiliser le nouvel opérateur lors de l'application à une fonction, et non tout autre objet.

Questions connexes