defineProperty是Object对象特有的方法,其作用是为对象定义新的属性和修改对象原有的属性。
调用形式为:Object.defineProperty(obj, prop, descriptor)
obj:属性所在的对象
prop:属性的名称
descriptor:描述符对象,表示属性的行为对象,该对象的属性为为以下的四种值,可设置其中一个或多个
1、configurable:表示能否通过delete删除属性,能否把属性修改为访问器属性(包含getter、setter属函数),默认为true。
2、enumerable:表示能否通过for-in循环返回该属性,默认为true。
3、writable:表示能否该修属性的值,默认为true.
4、value:包含属性的值。默认为true.
eg:修改属性
var person={
name:'xiami'
};
person.name='xia'; //此处可以修改name的值
console.log(person.name);//xia
Object.defineProperty(person,'name',{writable:false}); //设置其属性不可以修改
person.name='macal';
console.log(person.name) //xia
其运行结果如下:
此外该函数也可以创建属性
eg:
var person={
name:'xiami'
};
Object.defineProperty(person,'age',
{
configurable:true, //如果不指定,默认为false
value:22
}
);
console.log(person.age) //22
此外也可以用该方法定义访问器属性(用于读取或修改对象属性的属性,该属性包含getter和setter方法)
eg:
var book={
_year:2004
};
Object.defineProperty(book,'year',
{
get:function(){
console.log('调用get方法');
return this._year
},
set:function(value){
console.log('调用get方法');
this._year=value;
}
}
);
//调用修改器year属性修改_year
book.year=2017;
//调用访问器属性year访问_year
console.log(book.year);
其运行结果如下:
可见,修改器属性相当于一个用于修改对象属性的属性
不过在实际运用中一般比较少用该方法。