2009-09-08 13 views
15

Gefunden dies bei MDC aber, wie wenn ich eine private Variable auf denWie kann man eine private Variable zu diesem JavaScript-Objekt-Literal-Snippet hinzufügen?

var dataset = { 
    tables:{ 
     customers:{ 
      cols:[ /*here*/ ], 
      rows:[ /*here*/ ] 
     }, 
     orders:{ 
      cols:[ /*here*/ ], 
      rows:[ /*here*/ ] 
     } 
    }, 
    relations:{ 
     0:{ 
      parent:'customers', 
      child:'orders', 
      keyparent:'custid', 
      keychild:'orderid', 
      onetomany:true 
     } 
    } 
} 

Die Art und Weise verstehe ich OOP in Javascript hinzufügen gewollt hätte, würde ich den Zugang zu dataset.tables.customers.cols haben [0 ] wenn ein solcher Gegenstand existiert.
Aber wenn ich eine private Variable in Kunden platzieren wollte, wie würde das aussehen?
Das Hinzufügen von var index = 0; führt zu einem Laufzeitfehler.

Antwort

25

Sie können keine "privaten" Variablen ohne eine Funktion haben. Funktionen sind die einzige Möglichkeit, einen neuen Bereich in Javascript einzuführen.

Aber keine Angst, Sie können hinzufügen Funktionen in dem richtigen Ort, um diese Art von Funktionalität

var dataset = { 
    tables: { 
    customers:(function(){ 
     var privateVar = 'foo'; 
     return { 
     cols:[ /*here*/ ], 
     rows:[ /*here*/ ] 
     } 
    }()), 
    orders:{ 
     cols:[ /*here*/ ], 
     rows:[ /*here*/ ] 
    } 
    }, 
    relations: [{ 
    parent:'customers', 
    child:'orders', 
    keyparent:'custid', 
    keychild:'orderid', 
    onetomany:true 
    }] 
}; 

mit Ihrem Objekt zu gewinnen Aber das bringt uns nicht viel gewinnen. Dies ist immer noch meist nur ein Haufen wörtlicher Objekte. Diese Typen von "privaten" Variablen haben keine Bedeutung, da es keine Methoden gibt - nichts, was die Variablen in dem Bereich, den wir durch das Hinzufügen einer Funktion (eines Abschlusses) erstellt haben, tatsächlich lesen oder anderweitig verwenden würde.

Aber wenn wir eine Methode hätten, könnte das tatsächlich nützlich werden.

var dataset = { 
    tables: { 
    customers:(function(){ 
     var privateVar = 'foo'; 
     return { 
     cols:[ /*here*/ ], 
     rows:[ /*here*/ ], 
     getPrivateVar: function() 
     { 
      return privateVar; 
     } 
     }; 
    }()), 
    orders:{ 
     cols:[ /*here*/ ], 
     rows:[ /*here*/ ] 
    } 
    }, 
    relations: [{ 
    parent:'customers', 
    child:'orders', 
    keyparent:'custid', 
    keychild:'orderid', 
    onetomany:true 
    }] 
}; 

alert(dataset.tables.customers.getPrivateVar()); 
9

JavaScript fehlt die Art von Zugriffskontrollen, die Sie in starreren Sprachen erhalten. Sie können den privaten Zugriff für Objektdaten mit closures simulieren, aber Ihr Beispiel ist ein Objektliteral - eine einfache Datenstruktur - und kein konstruiertes Objekt.

Es hängt eher davon ab, was Sie mit dem Objekt machen wollen - die normale Technik für 'private' Mitglieder bedeutet, dass sie nur durch Member-Funktionen zugänglich sind, und Sie benötigen einen Konstruktor, um das Objekt zu erstellen. Die Literalsyntax wird für Datenstrukturen oder leichte Objekte mit öffentlichen Daten und Funktionen verwendet. Das Problem bei der Verwendung des privaten Abschlussmusters besteht darin, dass die Felder innerhalb eines Literals im öffentlichen Bereich liegen. Die durch die Schließung gegebene Vertraulichkeit ist jedoch darauf zurückzuführen, dass die Variable in einer Funktion definiert ist und daher lokal beschränkt ist. Sie könnten entweder eine Funktion erstellen, die das Literal klont und private Felder hinzufügt, oder ein öffentliches Feld mit privaten Daten hinzufügen. Sie können Schließungen auch als Mitglieder hinzufügen. Erstellen Sie also private Felder, die eher private als private Methoden sind.

dataset = { 
    secretCounter: ( 
     function() { 
     var c = 0; 
     return function() { return ++c; } 
    })(),  
    ... 

So hat dataset.secretCounter() eine varable c, die nur für diese Funktion ist privat.

+0

Oh! Ich glaube, du hast mich wieder auf den richtigen Weg gebracht. Datenstrukturen können keine privaten Mitglieder enthalten, da sie nur die Daten deklarieren (alles ist öffentlich!), Aber wenn ich dies in eine statische Klasse/Singleton (var obj = function() {}();) umschreibe, kann ich das tun zu so. Ist das korrekt? Vielen Dank. :) –

4

Private Variablen in Javascript werden mit dem Schlüsselwort var in einem Closure ausgeführt. Nur privilegierte Methoden und Attribute können darauf zugreifen. Hier ist der Weg es zu tun:

function dataset() 
{ 
var private_stuff = 10; // private 
this.foo = new function() { alert(private_stuff); } // priviliged 
return { 
    tables:{ 
     customers:{ 
       cols:[ ], 
       rows:[ ] 
     }, 
     orders:{ 
       cols:[ ], 
       rows:[ ] 
     } 
    }, 
    relations:{ 
     0:{ 
       parent:'customers', 
       child:'orders', 
       keyparent:'custid', 
       keychild:'orderid', 
       onetomany:true 
     } 
    } 
}; // public 
} 

var d = new dataset; 
alert(d.foo()); 
+2

var d = neuer Datensatz(); oder ist es: var d = datensatz(); – pkario

Verwandte Themen