【JS】属性描述对象

属性描述对象

【数据属性】

  • [[value]]:默认为 undefined

  • [[writable]]:是否可写,默认为true

  • [[enumerable]] :是否可枚举(会在循环中被列出),默认为true

    如果为false,则以下方法获取不到:

    • for...in
    • Object.keys()
    • JSON.stringify()
    • Object.assign()
  • [[configurable]]:是否可修改,默认为true

    • 一个属性被定义为不可配置之后,就不能再变回可配置的了

    • 可修改意味着:

      • 是否可以通过 delete 删除并重新定义

      • 是否可以修改它的特性

      • 是否可以把它改为访问器属性

【访问器属性】

  • gettersetter 函数,就不能有 [[value]][[writable]]

  • [[Get]]:获取函数,在读取属性时调用

  • [[Set]]:设置函数,在写入属性时调用

let book = {
	year_: 2017,
	edition: 1
};
Object.defineProperty(book, "year", {
    get() {
        return this.year_;
    },
    set(newValue) {
    	if (newValue > 2017) {
    		this.year_ = newValue;
    		this.edition += newValue - 2017;
    	}
	}
});
book.year = 2018;
console.log(book.edition); // 2
let user = {
    name: "John",
    surname: "Smith",
    get fullName() {
        return `${this.name} ${this.surname}`;
    },
    set fullName(value) {
        [this.name, this.surname] = value.split(" ");
    }
};
user.fullName = "kobe bryant"
console.log(user.fullName);

方法

【获取属性描述对象】

  • Object.getOwnPropertyDescriptor(obj, propertyName):获取属性描述对象

  • Object.getOwnPropertyDescriptors(obj):获取所有属性的描述对象(最全

    用于克隆

    Object.defineProperties({}, Object.getOwnPropertyDescriptors(obj));
    

【设置属性描述对象】

  • Object.defineProperty(obj, propertyName, descriptor):设置单个属性的属性描述对象

    默认都为false

    let person = {};
    Object.defineProperty(person, "name", {
    	writable: false,
    	value: "Nicholas"
    });
    console.log(person.name); // "Nicholas"
    person.name = "Greg";
    console.log(person.name); // "Nicholas"
    
  • Object.defineProperties(obj, descriptors):设置多个

    let book = {};
    Object.defineProperties(book, {
        year_: {
        	value: 2017
    	},
        edition: {
            value: 1
        },
        year: {
            get() {
                return this.year_;
            },
            set(newValue) {
                if (newValue > 2017) {
                this.year_ = newValue;
                this.edition += newValue - 2017;
                }
            }
        }
    });
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值