JavaScript中有关对象属性的一些操作

创建对象

var obj={};
var obj=new Object();
var obj=Object.create(Object.prototype);        //Object.create() 为ES5新增
var obj=Object.create(Object.prototype,<属性描述符列表>);  
<属性描述符列表>格式:{
    prop1: <属性描述符1>,
    prop2: <属性描述符2>,
    ...
}
属性描述符可以是:{
    value:<value>,
    writable:[true|false],
    enumerable:[true|false],
    configurable:[true|false]
} 或 {
    get: function() {},
    set: function() {},
    enumerable:[true|false],
    configurable:[true|false]
}

删除属性

delete obj.property;
delete obj['property'];

检测属性

'property' in obj;      //检测属性是否存在
obj.hasOwnProperty('property');     //检测该属性是否为自有属性(非继承而来)
obj.propertyIsEnumerable('property');   //ES5新增,检测属性是否为自有属性,且可枚举
Object.getOwnPropertyDescriptor(obj, 'property')    //ES5新增,获取对象obj的属性property的属性描述符

设置属性

obj.property=value;
obj['property']=value;
obj={
    prop1: value1,
    prop2: value2,

    //getter和setter为ES5新增
    get prop3() {
        return somevalue;
    },
    set prop3(value) {
        //process and save value
    }
};

配置属性的特性,ES5新增

Object.defineProperty(obj,'property',<属性描述符>);
obj的属性会被定义,同时返回obj
例如:
Object.defineProperty(obj,'property',{value:'value', writable:true, enumerable:true, configurable:true});
Object.defineProperty(obj,'property',{get:function(){}, set:function(){}, enumerable:true, configurable:true});

批量配置属性特性

Object.defineProperties(obj,<属性描述符列表>);
//obj的属性会被设置,同时返回obj

枚举属性

for(property in obj) { console.log(property); }     //只能列出可枚举属性
Object.keys(obj);       //ES5新增,返回属性名数组,只能列出自有属性,只能列出可枚举属性
Object.getOwnPropertyNames(obj);    //ES5新增,返回属性名数组,只能列出自有属性,列出的属性包括不可枚举属性

修改对象可扩展性,ES5新增

Object.preventExtensions(obj);  //阻止对象扩展,不能添加新属性
Object.isExtensible(obj);       //检测对象是否可扩展

Object.seal(obj);   //封闭对象,除了不能扩展,还不能配置属性特性,但可写属性依然可以赋值
Object.isSealed(obj);   //检测对象是否封闭的

Object.freeze(obj); //冻结对象,除了封闭对象,所有属性都配置为只读
Object.isFrozen(obj);   //检测对象是否冻结的