我希望能够做类似的事情
foo.x = 7;
然后做一些事情使该属性只读,以便没有其他代码可以更改它。IE 我想要
foo.x = 10; //should do nothing
无论如何,在 JS 中什么都不做?
我希望能够做类似的事情
foo.x = 7;
然后做一些事情使该属性只读,以便没有其他代码可以更改它。IE 我想要
foo.x = 10; //should do nothing
无论如何,在 JS 中什么都不做?
使用 ECMAScript5,您可以实现:
var foo = {};
Object.defineProperty(foo, 'x', {
value: 7,
writable: false,
configurable: false,
enumerable: true
});
您可能想查看MDN JavaScript以了解 ECMAScript5 的内容。
我想这就是你要找的。检查可写属性下的示例
不过,它仅适用于提供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...
您可以使用Object.defineProperty来执行此操作。
Object.defineProperty(foo, "x", {writable:false})
看到这个小提琴
如果你想让整个 Object 不可写,你也可以使用 Objects freeze方法
Object.freeze(foo);
这是 John Resig 撰写的一篇很棒的博客文章。请注意只读、可配置和可扩展的属性:
好吧,为了向后兼容旧浏览器,您可能需要定义访问器函数。或者,您可以使用各种框架(例如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.
- 滕吉兹