1

我希望能够做类似的事情

foo.x = 7;

然后做一些事情使该属性只读,以便没有其他代码可以更改它。IE 我想要

foo.x = 10; //should do nothing

无论如何,在 JS 中什么都不做?

4

5 回答 5

4

使用 ECMAScript5,您可以实现:

var foo = {};

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

您可能想查看MDN JavaScript以了解 ECMAScript5 的内容。

于 2012-10-04T15:40:07.043 回答
1

我想就是你要找的。检查可写属性下的示例

不过,它仅适用于提供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...
于 2012-10-04T15:37:30.243 回答
0

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

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

看到这个小提琴

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

Object.freeze(foo);

于 2012-10-04T15:43:39.197 回答
0

这是 John Resig 撰写的一篇很棒的博客文章。请注意只读、可配置和可扩展的属性:

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

于 2012-10-04T15:45:24.307 回答
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.

- 滕吉兹

于 2012-11-03T13:20:48.973 回答