ECMAScript5 中对象属性的新特性

作者 happyWang 日期 2014-10-17 Views
ECMAScript5 中对象属性的新特性

ecmascript5-defineProperty

在ECMAScript3中,对象的属性是很简单的,可读可写可遍历,也不存在公有私有的说法。

为了实现只读变量,很多时候不得不依赖闭包。

var o = (function(){
    var readOnlyVarible = '我是只读的';
        
    return {
        getReadAbleVarible = function(){
            return readOnlyVarible;
        }
    };
});

在ECMAScript5中,针对对象的属性,新增三种描述writable(可写性),enumerable(可枚举性)和configurable(可配置性),还有一个是跟早期的描述等同的value(属性值)

下面是摘自MDN中关于这四个属性描述

configurable 当且仅当这个属性描述符值为 true 时,该属性可能会改变,也可能会被从相应的对象删除。默认为 falseenumerable true 当且仅当该属性出现在相应的对象枚举属性中。默认为 false。 数据描述符同时具有以下可选键值: value 与属性相关的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认为 undefinedwritable 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 // 防止修改可写性
});