2009-08-08 18 views
10

Code:Was ist der Unterschied zwischen diesen beiden Codebeispielen? 1

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

Code 2:

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

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

Edit: Also, Jungs, meinen Sie das zweite ist besser? oder "formeller"?

+0

Dies ist auch eine gute Frage für mich, vielen Dank für die Buchung. –

+0

In Bezug auf Ihre Frage in der Bearbeitung hängt es davon ab, was Sie tun möchten. Wenn Sie nur eine Kopie des Objekts haben, wählen Sie die erste Syntax. Wenn mehrere Kopien erstellt werden sollen (zB wenn 'Etwas' in anderen Sprachen '' Class' 'ist), wählen Sie die zweite Syntax (oder eine bearbeitete Version, in der Sie 'sayHi' im Konstruktor definieren mit' this.sayHi = function() {...} ', das ist die Norm). –

Antwort

8

Grundsätzlich zu tun haben Im ersten Beispiel deklarieren Sie eine object literal, die eigentlich schon eine Objektinstanz ist.

In Ihrem zweiten Beispiel definieren Sie eine Konstruktorfunktion, die mit dem Operator new zum Erstellen von Objektinstanzen verwendet werden kann.

Objektliterale können auch verwendet werden, um neue Instanzen von Objekten zu erstellen und prototypische Vererbung zu machen, Douglas Crockford fördert auch diese Technik.

Grundsätzlich können Sie eine object Betreiber haben:

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

Diese Hilfsfunktion kann auf eine sehr intuitive und bequeme Art und Weise verwendet werden.

Es erhält grundsätzlich ein Objekt als Parameter innerhalb der Funktion einer neue Objektinstanz erstellt wird, das alte Objekt ist auf das neue Objekt des Prototyp gekettet, und seine zurückgeführt.

Es kann wie folgt verwendet werden: können

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(); 

Sie noch weiter gehen, wie Sie wollen, neue Instanzen von den Objekten zuvor definierten machen.

Empfehlung:

+0

Die Verwendung von 'Object (Something)' ist nicht dasselbe wie die Verwendung des 'new' Schlüsselwortes. Insbesondere wenn Sie eine Eigenschaft im ersten Fall ändern, wird sie global geändert. Zum Beispiel ändert 'Object (Something) .name =" new name "' es für Something selbst, während '(new Something()). Name =" new name "' ändert es nur für diese bestimmte _instance_. –

+0

Ja, tut mir leid, ich dachte über den "Objekt" -Operator in diesem Artikel beschrieben ... http://javascript.crockford.com/prototypal.html – CMS

+0

@Sinan, stark bearbeitet ... habe nicht in 24 Stunden geschlafen: -) ... – CMS

7

In der ersten Code-Snippet, Something ist ein einfaches Objekt, und kein Konstruktor. Insbesondere können Sie nicht anrufen:

var o = new Something(); 

Eine solche Form der Erstellung von Objekten ist perfekt für Singletons; Objekte, von denen Sie nur eine Instanz benötigen.

Im zweiten Schnipseln, Something ist ein Konstruktor, und Sie können mit dem new Schlüsselwort verwenden.

Edit:

Auch in Ihrem zweiten Schnipsel, da Sie verwenden Something.name zu this.name Gegensatz, wird es den Namen des Konstrukteurs selbst immer aufmerksam, die „Something“ ist, es sei denn, Sie überschreiben Sie diese Eigenschaft mit etwas wie Something.name = "Cool";.

Sie wollten wahrscheinlich diese Zeile sagen:

alert(this.name); 
1

Im ersten Beispiel Sie

Something.sayHi(); 

während in der zweiten tun können Sie es

new Something().sayHi(); 
Verwandte Themen