2010-03-11 10 views

risposta

14

Realisticamente ... non sovrascrivendolo. È sempre possibile controllare l'accesso racchiudendolo in un oggetto che offre solo GetObj senza SetObj, ma ovviamente il wrapper è ugualmente soggetto alla sovrascrittura, così come le sue proprietà "private" dei membri che sarebbero "nascoste" tramite il metodo GetObj.

In realtà, la domanda è una vittima:

Can Read-Only Properties be Implemented in Pure JavaScript?

EDIT:

Dopo aver letto http://javascript.crockford.com/private.html, è possibile utilizzare la chiusura per creare riferimenti a variabili che sono veramente inaccessibili dal mondo esterno. Per esempio:

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

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

var hider=new objectHider(someData); 

//... hider.getObject() 

dove il riferimento obj in objectHider non può essere modificati dopo la creazione dell'oggetto.

Sto cercando di pensare a un uso pratico per questo.

+4

In realtà 'hider.getObject' restituisce semplicemente un riferimento all'oggetto' someData' e * può * essere modificato, es: 'hider.getObject(). apples = 0;' then 'hider.getObject();' restituirà lo stesso oggetto modificato, poiché 'hider.getObject() == someData' ... – CMS

+0

Certo, ma è il stesso oggetto. Ho solo affermato che il riferimento a esso era immutabile, non le sue proprietà. Ora, se alcuniData implementassero anche la tecnologia più potente ...? – spender

+1

Avresti bisogno di creare una copia profonda dell'oggetto per farlo funzionare. L'estensione di jQuery può essere usata per fare ciò: 'function (obj) {return $ .extend ({}, obj); } ' – crush

42

Nell'attuale implementazione ampiamente disponibile, ECMAScript 3 non è supportato l'immutabilità reale .

Lo standard ECMAScript 5 aggiunge i metodi Object.seal e Object.freeze.

Il metodo Object.seal impedisce l'aggiunta di proprietà, consentendo comunque all'utente di scrivere o modificare le proprietà.

Il metodo Object.freeze bloccherà completamente un oggetto. Gli oggetti rimarranno esattamente come erano quando hai freeze e una volta che un oggetto è stato bloccato non può essere non congelato.

In conclusione, per reale immutabilità oggetto dovremo aspettare fino a ECMAScript 5.

Maggiori informazioni:

+0

Se si crea una funzione getter che restituisce Object.freeze (theObject), quando si utilizza il getter non è possibile modificare i valori dell'oggetto originale. – Shahar