备注:本文长期修改
说明:ECMAScript中属性有两种:数据属性和访问器属性。
属性描述符
1. 数据属性
特性名称 | 描述 | 默认值 |
---|---|---|
value | 设置属性的值 | undefined |
writable | 设置是否可修改值 | true |
enumerable | 表示能否通过for-in循环返回属性。 | true |
configurable |
|
true |
在使用 Object.defineProperty
、Object.defineProperties
或 Object.create
函数的情况下添加数据属性,writable、enumerable和configurable默认值为 false
。
使用 对象字面量 创建的属性,writable、enumerable和configurable特性默认为true。
2. 访问器属性
特性名称 | 描述 | 默认值 |
---|---|---|
Get | 在读取属性时调用的函数 | undefined |
Set | 在写入属性时调用的函数 | true |
enumerable | 是否可以被枚举(使用for...in或Object.keys()) | true |
configurable |
|
true |
var obj = {};
Object.defineProperty(obj, "newKey", {
get:function (){} | undefined,
set:function (value){} | undefined
configurable: true | false
enumerable: true | false
});
注意:当使用了getter或setter方法,不允许使用writable和value这两个属性
ECMAScript 5中操作属性特性的方法有3个:
1. Object.defineProperty()
语法:
Object.defineProperty(obj, prop, descriptor)
参数列表:
obj:必需。目标对象
prop:必需。需定义或修改的属性的名字
descriptor:必需。目标属性所拥有的特性
返回值:
传入函数的对象。即第一个参数obj
示例
var obj = {};
// Object.defineProperty(对象,属性,属性描述符)
Object.defineProperty(obj, "name", {
get: function(){
return this._name; //在 get 和 set 中使用访问属性必须加 "_"
},
set: function(val){
if(Array.isArray(val)){
this._name = val;
} else{
this._name = "不是数组不能赋值";
}
},
enumerable: true, // 表示可枚举的
configurable: true // 是否可删除属性
});
// Object {get: function, set: function, enumerable: true, configurable: true}
console.log(Object.getOwnPropertyDescriptor(obj, 'name'));
obj.name = "111";
console.log(obj.name);