如何在JavaScript中使变量/对象只读?

38

https://dev59.com/X3RC5IYBdhLWcg3wP-dh - spender
2个回答

74

在当前普遍可用的实现中,ECMAScript 3没有真正支持不变性

更新:现在,ECMAScript 5标准得到广泛支持。它新增了Object.sealObject.freeze方法。

Object.seal方法将防止属性添加,但仍允许用户编写或编辑现有属性。

Object.freeze方法将完全锁定对象。对象将完全保持冻结状态。一旦对象被冻结,就无法解冻

更多信息:


如果您创建一个返回Object.freeze(theObject)的getter函数,那么在使用getter时就无法更改原始对象的值。 - Shahar
Object.freeze() 方法会递归冻结对象所有的属性,包括嵌套对象的属性,而不仅仅是顶层对象的属性。 - user5047085
2
@MrCholo,Object.freeze仅在当前对象级别中起作用,设置自有属性不可配置和不可写,并防止进一步扩展(添加新属性)。您可以在规范的以下部分检查冻结的内部:https://cms.gt/P7NKq - Christian C. Salvadó
现在,Object.sealObject.freeze都得到了很好的支持。 - Dave F

18

编辑:这是十年前写的。我不认为这是一个最新的答案。

实际上...通过不覆盖它来控制访问。您可以始终通过将其包装在仅提供GetObj而不是SetObj的对象中来控制访问,但是,当然,该包装器同样有可能被覆盖,其“私有”成员属性也将通过GetObj方法“隐藏”。

实际上,问题是重复的:

Can Read-Only Properties be Implemented in Pure JavaScript?

编辑:

阅读http://javascript.crockford.com/private.html后,可以使用闭包创建真正无法从外部世界访问的变量引用。例如:

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

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

var hider=new objectHider(someData);

//... hider.getObject()

在 objectHider 中对 obj 的引用在对象创建后是不可修改的

我正试图想出这个的一个实际用途。


9
实际上,hider.getObject 只是返回对 someData 对象的引用,并且它是可以被修改的,例如:hider.getObject().apples = 0; 那么 hider.getObject(); 将返回相同的修改后的对象,因为 hider.getObject() == someData... - Christian C. Salvadó
当然可以,但它是同一个对象。我只声称对它的引用是不可改变的,而不是它的属性。现在,如果someData也实现了隐藏技术呢? - spender
2
你需要创建对象的深拷贝才能使其正常工作。可以使用jQuery的extend方法来实现:function (obj) { return $.extend({}, obj); } - crush

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接