6.1.2 属性类型

数据属性

包含一个数据值的位置,有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

有待后续研读

发布了43 篇原创文章 · 获赞 0 · 访问量 305

猜你喜欢

转载自blog.csdn.net/weixin_44774877/article/details/103847244