修改属性默认的特性:
Object.defineProperty(属性所在的对象,属性名字,描述符对象)
在调用Object.defineproperty()方法创建一个新的属性时,
如果不指定,configurable、enumerable和writable特性的默认值都为false
描述符对象:
属性对象必须为:configurable、enumerable、writable和value其中的一个或多个值
如:
var person = {}; Object.defineProperty(person,"name",{ writable:false, value:"LiAo" }) alert(person.name); // “LiAo” person.name = "MrLiao"; alert(person.name) ; //"LiAo"
属性类型
- 数据属性
- configurable: 能否delete、能否修改特性、能否修改为访问器属性,默认为true, ps: 一旦设置为false后不可逆转
- enumerable: 能否通过for-in循环返回属性,默认为true
- writable: 能否修改属性值,默认为true
- value: 包含着这个属性的值,默认为undefined
- 访问器属性
访问器属性不包含数据值,而是包含一对getter和setter函数(不是必须)
读取访问器属性——>调用getter,负责返回有效的值
写入访问器属性——>调用setter,负责如何处理数据
- configurable: 同上
- enumerable:同上
- Get:读取属性时调用的函数,默认值为undefined
- Set:写入属性时调用的函数,默认值为undefined
使用访问器属性的常见方式:设置一个属性的值会导致其他属性发生变化:
var book = {
_year:2004,
edition:1
};
Object.defineProperty(book,"year",{
get:function(){
return this._year;
},
set:function(newValue){
this._year = newValue;
this.edition += newValue -2004;
}
}
});
book.year = 2005;
alert(book.edition); //2
注意如果不是同时制定getter和setter的话,如只指定getter意味着属性时不可写的,写入属性会被忽略。所以要根据需求指定这两个函数,不然会出现一些小毛病哈
定义多个属性
使用Object.defineProperities()方法
var book = {}; Object.defineProperties(book,{ 第一个数据属性名:{ writable等特性: 布尔值 value: 属性值 }, 第一个数据属性名:{ writable等特性: 布尔值 value: 属性值 }, 第一个访问器属性名:{ get:function(){} set : function(){} },
读取属性的特征
Object.getOwnPropertyDescriptor(属性所在的对象,属性名称)
若是数据属性,返回包含configurable,enumberable,writable,value属性的对象
若是访问器属性,返回包含configurable,enumberable,get,set属性的对象