2010-11-23 21 views
0
<HTML> 
    <HEAD> 
     <SCRIPT LANGUAGE="JavaScript"> 
     function Peon(number) { 
      this.number = number; 

      this.inc = function() { 
       number=number+1; 
      }; 

      return true; 
     } 
     var p=new Peon(10); 

     function returnNumber() { 
      p.inc(); 
      alert(p.number); 
     } 
     </SCRIPT> 
    </HEAD> 
    <BODY> 

     <INPUT id="b00" TYPE="button" Value="Click" onClick="returnNumber()"> 

    </BODY> 
    </HTML> 

Dieser Code funktioniert nicht wie vorgesehen. Gibt es eine Möglichkeit, es ohne zu machen arbeitet mitZugriff auf Variablen in Objekten in Javascript ohne "dieses"

this.number=this.number+1; 

Hier ist eine triviale Wahl zu schreiben, aber in größeren Codes das nicht mit. * Wäre es besser lesbar viel machen. Ist es möglich?

Antwort

2

Sie können number "privat" machen, aber dann müssen Sie einen Getter:

function Peon(number) { 
     var number = number; 

     // increment 
     this.inc = function() { 
      number++; 
     }; 

     // a simple getter 
     this.getNumber = function() { 
      return number; 
     } 
    } 
    var p = new Peon(10); 
    p.inc(); 
    alert(p.getNumber()); 

Sie sollten Douglas Crockfords lesen „The Good Parts "Für weitere Informationen zur Verwendung dieses Musters gibt es (eingeschränkt) eine Vorschau unter Google Books.

Sie müssen auch nichts vom Konstruktor zurückgeben, Ihre return true ist überflüssig.

+2

Sie können über Crockfords private Mitglieder Muster auf seiner Website lesen: http://javascript.crockford.com/private.html Es ist sehr wichtig ** zu beachten, dass, wenn Sie viele Peons haben, dieses private Member-Muster deutlich mehr Speicher verbraucht als nur eine Eigenschaft, weil jedes einzelne Objekt seine * eigene Kopie * der beiden Funktionen hat im Konstruktor definiert. Sie sind nicht und können nicht zwischen Objekten geteilt werden. Der Nachteil ist also die Privatsphäre gegenüber der Speicherbenutzung. Speicherverbrauch ist ein großes Problem bei IE und Firefox. Wenn Sie nur ein paar Peons haben wollen, ist das egal. –

+0

Danke, das ist, was ich gesucht habe –

+0

'return true' ist in der Tat überflüssig und im Wesentlichen ignoriert am Ende eines Konstruktors, aber die Rückgabe eines Objekts anstelle eines Primitivs würde nicht ignoriert werden und würde dieses Objekt anstelle des neuen' zurückgeben Peon' Objekt. –

0

Nicht wirklich, aber das ist ein wenig prägnante

this.number++ 

Eigentlich als eine Randnotiz, würden Sie besser dran, außerhalb des Konstruktor von Peon erklärt .inc. Du könntest das mit dem Prototyp machen. Auf diese Weise wird die inc-Funktion nicht jedes Mal neu erstellt, wenn Sie ein Objekt vom Typ Peon erstellen.

Peon.prototype.inc = function(){ 
    this.number++; 
} 

Oder statt p.inc() verwenden Sie p.number++ tun könnte. Nur so kann ich dieses Keyword vermeiden.

0

Die einzige lesbare Art und Weise kann ich sehen würde es tun:

this.inc = function() { 
    this.number++; 
}; 

Ansonsten in Ihrem "größeren Codes" Postulat, Sie so etwas tun könnte:

this.inc = function() { 
    var number = this.number; // obviously simple here. Imagine more complexity 
    number++; 
}; 
+0

Sorry, aber dein zweiten Vorschlag dies nicht funktioniert ... –

1

Nein, müssen this verwenden, um Eigenschaften auf dem Objekt this zu referenzieren. Beachten Sie, dass sich this in JavaScript sehr von this in einigen anderen Sprachen wie C oder Java unterscheidet. Mehr here und here.

Was Ihr Code macht, ist das number Argument zugreifen, die in die Peon Konstruktor-Funktion übergeben wurde, anstatt die this.number Eigenschaft, die Sie im Konstruktor erstellt. Deshalb funktioniert es nicht wie vorgesehen, aber auch nicht.

Es gibt keinen Grund, Ihre inc Betrieb innerhalb die Peon Konstruktor Funktion zu definieren, BTW, und einige gute Gründe, nicht zu (jedes einzelne Objekt über Peon erstellt wird seine ganz eigene Kopie dieser Funktion erhalten). Anstatt also, können Sie es wie folgt definieren:

function Peon(number) { 
    this.number = number; 

    // Don't return values out of constructor functions, it's 
    // an advanced thing to do. In your case, you were returning 
    // `true` which was being completely ignored by the JavaScript 
    // interpreter. If you had returned an object, the `this` object 
    // created for the `new Peon()` call would have been thrown away 
    // and the object you returned used instead. 
} 

Peon.prototype.inc = function() { 
    ++this.number; 
}; 

var p=new Peon(10); 

function returnNumber() { 
    p.inc(); 
    alert(p.number); // alerts 11 
} 
+0

+1 für Sie und @ Ivo. Die Kombination der beiden macht insgesamt eine gute Antwort. – Matt

+0

als eine Randnotiz - warum ++ this.number anstelle von this.number ++? Ich weiß, dass sie etwas anders bewerten, aber in diesem Anwendungsfall wäre es austauschbar. Nur neugierig, da ich die this.number ++ Form häufiger sehe. – Matt

+0

@Matt: Meine Muttersprache ist Englisch, in der "Verb-Nomen" ist ein dramatisch häufiger Sprachmuster als "Nomen-Verb", und so schreibe ich "inkrement x" ('++ x') und nicht" x inkrementieren "(' x ++ '). Wenn ich ein deutscher Muttersprachler wäre, würde ich 'x ++' schreiben. :-) In der überwiegenden Mehrheit der Fälle gibt es keinen * echten * Unterschied. (Ich betone "real-world", weil sonst lurkers sich stürzen und versuchen, Mikro-Optimierung. :-)) –

0

Ja, Sie müssen "this" nicht in Javascript verwenden.Sie können Variablen über Schließung Zugriff statt ‚this‘

function createPeon(number) { 
 

 
    function inc() { 
 
     number=number+1; 
 
    }; 
 
    function getNumber() { 
 
     return number; 
 
    } 
 

 
    return { inc, getNumber }; 
 
} 
 
var p=createPeon(10); 
 
p.inc(); 
 
alert(p.getNumber());

Verwandte Themen