2009-08-08 9 views
10

Code 1:Quelle est la différence entre ces deux exemples de code?

var Something = { 
name: "Name", 
    sayHi: function(){ 
    alert(Something.name); 
    } 
} 

Code 2:

function Something(){ 
    this.name = "Name"; 
} 

Something.prototype.sayHi = function(){ 
    alert(Something.name); 
} 

Edit: Alors, les gars, vous voulez dire que le second est mieux? ou plus "formel"?

+0

C'est aussi une bonne question pour moi, merci pour l'affichage. –

+0

En ce qui concerne votre question dans l'édition, cela dépend de ce que vous voulez faire. Si vous avez seulement une copie de l'objet, optez pour la première syntaxe. Si vous voulez créer plusieurs copies (comme si 'Something' était un' Class' dans d'autres langages), optez pour la seconde syntaxe (ou en fait une version éditée dans laquelle vous définissez 'sayHi' dans le constructeur en utilisant' this.sayHi = function() {...} ', c'est la norme). –

Répondre

8

Fondamentalement Dans le premier exemple, vous déclarez un object literal qui est déjà une instance d'objet.

Dans votre deuxième exemple, vous définissez une fonction de constructeur qui peut être utilisée avec l'opérateur new pour créer des instances d'objet.

Les littéraux d'objet peuvent également être utilisés pour créer de nouvelles instances d'objets et faire un héritage prototypique, Douglas Crockford promeut également cette technique.

Fondamentalement, vous pouvez avoir un opérateur object:

function object(o) { 
    function F() {} 
    F.prototype = o; 
    return new F(); 
} 

Cette fonction d'aide peut être utilisé d'une manière très intuitive et pratique.

Il reçoit essentiellement un objet en tant que paramètre, dans la fonction d'une instance nouvel objet est créé, l'ancien objet est enchaînée au prototype du nouvel objet, et son retour.

Il peut être utilisé comme ceci:

var oldObject = { 
    firstMethod: function() { alert('first'); }, 
    secondMethod: function() { alert('second'); }, 
}; 

var newObject = object(oldObject); 
newObject.thirdMethod = function() { alert('third'); }; 

var otherObject = object(newObject); 
otherObject.firstMethod(); 

Vous pouvez aller plus loin que vous le souhaitez, faire de nouvelles instances des objets précédemment définis.

Recommandé:

+0

L'utilisation de 'Object (Something)' n'est pas la même chose que l'utilisation du mot-clé 'new'. En particulier, si vous modifiez une propriété dans le premier cas, elle sera modifiée globalement. Par exemple 'Objet (Quelque chose) .name =" nouveau nom "' le change pour Quelque chose lui-même, alors que '(new Quelque chose()). Name =" nouveau nom "' ne le modifie que pour cette instance particulière. –

+0

Oui, désolé je pensais à l'opérateur 'objet' décrit dans cet article ... http://javascript.crockford.com/prototypal.html – CMS

+0

@Sinan, fortement édité ... n'ont pas dormi dans les 24 heures: -) ... – CMS

7

Dans le premier extrait de code, Something est un objet simple, et non un constructeur. En particulier, vous ne pouvez pas appeler:

var o = new Something(); 

Une telle forme de création d'objets est parfaite pour les singletons; objets dont vous avez seulement besoin d'une instance.

Dans le deuxième extrait , Something est un constructeur, et vous pouvez utiliser le mot-clé new avec elle.

Edit:

Aussi, dans votre deuxième extrait, puisque vous utilisez Something.name par opposition à this.name, il sera toujours alerter le nom du constructeur lui-même, qui est « quelque chose », à moins que vous remplacer cette propriété par quelque chose comme Something.name = "Cool";.

Vous avez probablement voulu cette ligne-à-dire:

alert(this.name); 
1

Dans premier exemple vous pouvez faire

Something.sayHi(); 

alors que dans le second, vous devez le faire

new Something().sayHi(); 
Questions connexes