在ECMAScript3中,对象的属性是很简单的,可读可写可遍历,也不存在公有私有的说法。
为了实现只读变量,很多时候不得不依赖闭包。
var o = (function(){
var readOnlyVarible = '我是只读的';
return {
getReadAbleVarible = function(){
return readOnlyVarible;
}
};
});
在ECMAScript5中,针对对象的属性,新增三种描述writable(可写性),enumerable(可枚举性)和configurable(可配置性),还有一个是跟早期的描述等同的value(属性值)
下面是摘自MDN中关于这四个属性描述
configurable
当且仅当这个属性描述符值为 true 时,该属性可能会改变,也可能会被从相应的对象删除。默认为 false。enumerable
true 当且仅当该属性出现在相应的对象枚举属性中。默认为 false。 数据描述符同时具有以下可选键值:value
与属性相关的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认为 undefined。writable
true 当且仅当可能用 赋值运算符 改变与属性相关的值。默认为 false。
上述的默认值是指的用Object.defineProperty()方法创建属性的时候的默认值,而不是通常那种直接量或者.的方式创建的属性的默认值,使用后者创建属性的时候,三个bool型的描述符的值都是true。
有了这新增的三个描述符之后,在创建只读属性的时候就方便多了
var o = {};
Object.defineProperty(o,'readOnlyVarible',{
writable: false,
enumberable: true,
configurable: false, // 防止修改可写性
value: '我是只读的'
});
或者下面这种方式(把一个已经定义的属性设置为只读的)
var o = {};
o.readOnlyVarible = '我是只读的'
Object.defineProperty(o,'readOnlyVarible',{
writable: false,
enumberable: true,
configurable: false // 防止修改可写性
});
原创内容,欢迎转载 😊