2010-03-11 6 views

Respuesta

14

Realísticamente ... al no sobreescribirlo. Siempre se puede controlar el acceso envolviéndolo en un objeto que solo ofrece GetObj sin SetObj, pero, por supuesto, el contenedor también puede sobrescribirse, al igual que sus propiedades de miembro "privadas" que se "ocultan" mediante el método GetObj.

En realidad, la pregunta es una víctima:

Can Read-Only Properties be Implemented in Pure JavaScript?

EDIT:

Después de leer http://javascript.crockford.com/private.html, es posible utilizar el cierre para crear referencias a variables que son verdaderamente inaccesible desde el mundo exterior. Por ejemplo:

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

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

var hider=new objectHider(someData); 

//... hider.getObject() 

donde la referencia a obj en objectHider no puede ser modificado después de la creación del objeto.

Estoy tratando de pensar en un uso práctico para esto.

+4

En realidad 'hider.getObject' simplemente devuelve una referencia al objeto' someData', y * puede * modificarse, por ejemplo: 'hider.getObject(). apples = 0;' then 'hider.getObject();' devolverá el mismo objeto modificado, ya que 'hider.getObject() == someData' ... – CMS

+0

Claro, pero es el mismo objeto. Solo reclamé que la referencia no era modificable, no sus propiedades. Ahora, si someData también implementó Hider Tech ...? – spender

+1

Debería crear una copia profunda del objeto para que funcione. La extensión jQuery se puede usar para hacer esto: 'function (obj) {return $ .extend ({}, obj); } ' – crush

42

En la implementación ampliamente disponible actualmente, ECMAScript 3 no hay soporte para la inmutabilidad real .

La norma ECMAScript 5 agrega los métodos Object.seal y Object.freeze.

El método Object.seal evitará la incorporación de propiedades, permitiendo al usuario escribir o editar las propiedades.

El método Object.freeze bloqueará por completo un objeto. Los objetos se mantendrán exactamente como estaban cuando los los congele y una vez que un objeto se ha congelado, no puede ser descongelado.

En conclusión, para verdadera inmutabilidad objeto tendremos que esperar hasta ECMAScript 5.

Más información:

+0

Si crea una función getter que devuelve Object.freeze (theObject), al usar el getter no es posible cambiar los valores del objeto original. – Shahar

Cuestiones relacionadas