数据属性
包含一个数据值的位置,有4个特性:
[[configurable]] 属性特性是否可修改/删除,默认true
[[enumerable]] 是否可使用for-in枚举,默认true
[[writable]] 是否可修改属性值,默认true
[[value]] 属性值,默认undefined
Object.defineProperty方法修改特性值,接受三个参数:
对象名,属性名,修改的特性对象
let person = {
name : 'zz',
age : 18,
sex : 'girl'
};
Object.defineProperty(person,'name',{
writable : false //不可修改
});
console.log(person.name); //zz
person.name = 'zxx';
console.log(person.name); //zz
但是属性修改为不可配置之后,就不可再改回可配置
let person = {
name : 'zz',
age : 18,
sex : 'girl'
};
Object.defineProperty(person,'name',{
configurable : false //不可配置
});
console.log(person.name); //zz
delete person.name;
console.log(person.name); //zz
let person = {
name : 'zz',
age : 18,
sex : 'girl'
};
Object.defineProperty(person,'name',{
configurable : false
});
Object.defineProperty(person,'name',{
configurable : true, //报错
enumerable : false //报错
});
直接调用Object.defineProperty方法新增属性值,上述(前三个)特性默认值为false
let person = {};
Object.defineProperty(person,'name',{
value : 'zz'
});
person.name = 'zxx';
console.log(person.name); //zz 不可修改
delete person.name;
console.log(person.name); //zz 不可配置
访问器属性
包含一对儿getter 和 setter 函数(非必须),有4个特性:
[[configurable]]
[[enumerable]]
[[get]] 读取属性时调用的函数,默认undefined
[[set]] 写入属性时调用的函数,默认undefined
访问器属性不能直接定义,使用Object.defineProperty定义
let book = {
_year: 2004,
edition: 1
};
Object.defineProperty(book,'year',{
get : function() {
return this._year;
},
set : function(newValue) {
if(newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
}
});
book.year = 2005;
console.log(book.edition); //2
有待后续研读