如何使变量/对象在 Javascript 中只读? [复制]

Posted

技术标签:

【中文标题】如何使变量/对象在 Javascript 中只读? [复制]【英文标题】:How can you make a variable/Object read only in Javascript? [duplicate] 【发布时间】:2011-01-26 13:41:34 【问题描述】:

可能重复:Can Read-Only Properties be Implemented in Pure javascript?

我有一个我只想在构造时定义的对象。如何防止对象引用被更改?

【问题讨论】:

***.com/questions/366047/… 【参考方案1】:

在当前广泛使用的实现中,ECMAScript 3 不支持真正的不变性

更新:如今,ECMAScript 5 标准得到广泛支持。它添加了Object.sealObject.freeze 方法。

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

Object.freeze 方法将完全锁定一个对象。当您冻结对象时,对象将保持原样。一旦对象被冻结,就不能解冻

更多信息:

ECMAScript 5 Objects and Properties

【讨论】:

如果你创建了一个返回 Object.freeze(theObject) 的 getter 函数,那么在使用 getter 时就不可能改变原始对象的值。 Object.freeze 会递归冻结所有属性还是仅冻结对象拥有的(***)属性? @MrCholo, Object.freeze 将仅在当前对象级别中起作用,将自己的属性设置为不可配置和不可写,并防止进一步扩展(添加新属性)。您可以在规范的以下部分检查冻结的内部结构:cms.gt/P7NKq Object.seal 和 Object.freeze 现在都得到了很好的支持。【参考方案2】:

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

实际上...通过不覆盖它。您始终可以通过将其包装在一个仅提供 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 的引用不能在对象创建后修改。

我正在尝试为此考虑一个实际用途。

【讨论】:

其实hider.getObject只是返回一个someData对象的引用,它可以被修改,例如:hider.getObject().apples = 0;然后hider.getObject();会返回相同的修改对象,因为hider.getObject() == someData... 当然,但它是同一个对象。我只声称对它的引用是不可改变的,而不是它的属性。现在,如果 someData 也实现了隐藏技术...? 您需要创建对象的深层副本才能使其工作。可以使用 jQuery 的扩展来做到这一点:function (obj) return $.extend(, obj);

以上是关于如何使变量/对象在 Javascript 中只读? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在Vuejs中优雅使用Javascript各种插件

在JAVA中ArrayList如何保证线程安全

编辑只读 javascript 对象

javascript如何设置select只读不可用?

如何使 QSlider 只读?

如何使复选框只读?没有禁用?