Javascript:有没有办法让对象属性只读

时间:2012-10-04 15:34:02

标签: javascript object

我希望能够做一些像

这样的事情
foo.x = 7;

然后做一些事情使该属性只读,这样其他代码就无法改变它。 IE我想要

foo.x = 10; //should do nothing

在JS中无论如何都没有做到这一点?

5 个答案:

答案 0 :(得分:3)

使用ECMAScript5,您可以实现:

var foo = {};

Object.defineProperty(foo, 'x', {
    value: 7,
    writable: false,
    configurable: false,
    enumerable: true
});

您可能需要查看MDN JavaScript以获取ECMAScript5内容。

答案 1 :(得分:1)

我认为this正是您所寻找的。检查可写属性

下的示例

但它仅适用于提供 ECMA5 支持的浏览器。对于旧版浏览器,您无法定义不可写的属性,但可以设置可与 getter 一起使用的私有变量:

var foo = (function(x)
{
    var getX = function()
    {
        return x;
    };
    getX.valueOf = function()
    {
        return this();
    };
    return {x:x,getX:getX};
})(7);//pass constant value
foo.x === 7;//true
foo.x = 5;//will work
//BUT:
foo.getX();//returns 7, always
foo.getX;//returns 7, so can be used as though it weren't a method
//WARNING:
foo.getX = 213;//x is lost forever...

答案 2 :(得分:0)

您可以使用Object.defineProperty执行此操作。

Object.defineProperty(foo, "x", {writable:false})

请参阅此Fiddle

如果你想让整个Object不可写,你也可以使用Objects freeze方法

Object.freeze(foo);

答案 3 :(得分:0)

这是John Resig关于此的精彩博客文章。请注意readonly和可配置和可扩展的属性:

http://ejohn.org/blog/ecmascript-5-objects-and-properties/

答案 4 :(得分:0)

好吧,为了向后兼容旧浏览器,您可能需要定义访问者功能。或者,您可以使用各种框架提供的现成功能(例如bob.js):

var obj = { };
//declare read-only property.
bob.prop.namedProp(obj, 'name', 'Bob', true);
//declare read-write property.
bob.prop.namedProp(obj, 'age', 1);

//get values of properties.
console.log(bob.string.formatString('{0} is {1} years old.', obj.get_name(), obj.get_age()));
//set value of read-write property.
obj.set_age(2);
console.log(bob.string.formatString('Now {0} is {1} years old.', obj.get_name(), obj.get_age()));

//cannot set read-only property of obj. Next line would throw an error.
// obj.set_name('Rob');

//Output:
//========
// Bob is 1 years old.
// Now Bob is 2 years old.

- 坦吉斯