我希望能够做一些像
这样的事情foo.x = 7;
然后做一些事情使该属性只读,这样其他代码就无法改变它。 IE我想要
foo.x = 10; //should do nothing
在JS中无论如何都没有做到这一点?
答案 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和可配置和可扩展的属性:
答案 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.
- 坦吉斯