如何在Javascript中创建变量/对象?

qod*_*nja 27 javascript reference object readonly

可能重复:
可以在纯JavaScript中实现只读属性吗?

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

CMS*_*CMS 51

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

ECMAScript的5标准增加了Object.sealObject.freeze方法.

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

Object.freeze方法将完全锁定一个对象.对象将保持与冻结时完全一样,一旦对象被冻结,它就不会被解冻.

总之,对于真实对象的不变性,我们将不得不等到ECMAScript 5.

更多信息:

  • @MrCholo,`Object.freeze` 将仅在当前对象级别工作,将自己的属性设置为不可配置和不可写,并防止进一步扩展(添加新属性)。您可以在规范的以下部分检查冻结的内部结构:https://cms.gt/P7NKq (2认同)

spe*_*der 15

实际上......不要覆盖它.您总是可以通过将其包装在仅提供没有SetObj的GetObj的对象中来控制访问,但当然,包装器同样可以覆盖,因为它的"私有"成员属性将通过GetObj方法"隐藏".

实际上,问题是一个骗局:

可以在纯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()
Run Code Online (Sandbox Code Playgroud)

在创建对象后,无法修改objectHider中对obj的引用.

我试图想到这个的实际用途.

  • 实际上`hider.getObject`只是返回对`someData`对象的引用,它*可以被修改,例如:`hider.getObject().apples = 0;`then`hider.getObject();`将返回相同的修改对象,因为`hider.getObject()== someData` ... (6认同)
  • 您需要创建对象的深层副本才能使其工作。jQuery 的扩展可用于执行此操作:`function (obj) { return $.extend({}, obj); }` (2认同)