2010-03-11 16 views

Antwort

14

Realistisch ... indem Sie es nicht überschreiben. Sie können den Zugriff immer kontrollieren, indem Sie ihn in ein Objekt einfügen, das nur GetObj ohne SetObj anbietet, aber natürlich ist der Wrapper genauso anfällig für das Überschreiben wie seine "privaten" Elementeigenschaften, die über die GetObj-Methode "versteckt" würden.

Eigentlich Frage ist ein Betrogene:

Can Read-Only Properties be Implemented in Pure JavaScript?

EDIT:

Nach http://javascript.crockford.com/private.html Lesen ist es möglich, Verschluss zu verwenden Variablenreferenzen zu erstellen, die wirklich unzugänglich von der Außenwelt sind. Zum Beispiel:

function objectHider(obj) 
{ 
    this.getObject=function(){return obj;} 
} 

var someData={apples:5,oranges:4} 

var hider=new objectHider(someData); 

//... hider.getObject() 

wo die Referenz in objectHider obj nicht nach Objekterstellung geändert werden.

Ich versuche, eine praktische Verwendung dafür zu denken.

+4

Tatsächlich gibt 'hider.getObject' einfach einen Verweis auf das' someData' Objekt zurück und * kann * geändert werden. zB: 'hider.getObject(). apples = 0;' dann 'hider.getObject();' wird das gleiche modifizierte Objekt zurückgeben, da 'hider.getObject() == someData' ... – CMS

+0

Sicher, aber es ist das gleiches Objekt. Ich behauptete nur, der Hinweis darauf sei unveränderbar, nicht seine Eigenschaften. Nun, wenn someData auch Hider-Tech implementiert hat ...? – spender

+1

Sie müssten eine tiefe Kopie des Objekts erstellen, damit es funktioniert. jQuery's extend kann dazu verwendet werden: 'function (obj) {return $ .extend ({}, obj); } ' – crush

42

In der aktuellen weit verbreiteten Implementierung, ECMAScript 3 gibt es keine Unterstützung für echte Unveränderlichkeit.

Der ECMAScript 5-Standard fügt die Methoden Object.seal und Object.freeze hinzu.

Die Methode Object.seal verhindert das Hinzufügen von Eigenschaften, wobei der Benutzer weiterhin die Eigenschaften schreiben oder bearbeiten kann.

Die Methode Object.freeze wird ein Objekt vollständig sperren. Objekte bleiben genau so, wie sie waren, als sie einfrieren sie und sobald ein Objekt eingefroren wurde kann es nicht sein ungefroren.

Abschließend für realen Objekt Unveränderlichkeit wir bis ECMAScript warten müssen bis 5.

Weitere Informationen:

+0

Wenn Sie eine Getter-Funktion erstellen, die Object.freeze (theObject) zurückgibt, ist es bei Verwendung des GETTERs nicht möglich, die Werte des ursprünglichen Objekts zu ändern. – Shahar