web-dev-qa-db-fra.com

Comment rendre une variable / un objet en lecture seule en Javascript?

Duplicata possible:
Les propriétés en lecture seule peuvent-elles être implémentées en JavaScript pur?

J'ai un objet que je veux seulement définir une fois construit. Comment empêcher la modification de la référence d'objet?

29
qodeninja

De façon réaliste ... en ne l'écrasant pas. Vous pouvez toujours contrôler l'accès en l'enveloppant dans un objet qui ne propose que GetObj sans SetObj, mais bien sûr, l'encapsuleur est également susceptible d'être écrasé, tout comme ses propriétés de membre "privées" qui seraient "masquées" via la méthode GetObj.

En fait, la question est dupe:

Les propriétés en lecture seule peuvent-elles être implémentées en JavaScript pur?

ÉDITER:

Après avoir lu http://javascript.crockford.com/private.html , il est possible d'utiliser la fermeture pour créer des références de variables qui sont vraiment inaccessibles du monde extérieur. Par exemple:

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

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

var hider=new objectHider(someData);

//... hider.getObject()

où la référence à obj dans objectHider ne peut pas être modifiée après la création de l'objet.

J'essaie de penser à une utilisation pratique pour cela.

14
spender

Dans l'implémentation actuelle largement disponible, ECMAScript il n'y a pas de support pour l'immuabilité réelle .

La norme ECMAScript 5 ajoute le Object.seal et Object.freeze méthodes.

Le Object.seal empêchera les ajouts de propriétés, tout en permettant à l'utilisateur d'écrire ou de modifier les propriétés.

Le Object.freeze la méthode verrouille complètement un objet. Les objets resteront exactement tels qu'ils étaient lorsque vous les gelez et une fois qu'un objet a été gelé, il ne peut pas être gelé .

En conclusion, pour l'immuabilité réelle des objets nous devrons attendre ECMAScript 5.

Plus d'informations:

51
CMS