Object.defineProperty

本文介绍了JavaScript中Object.defineProperty方法,阐述了descriptor的两种描述:数据描述符和存取描述符,还说明了writable、enumerable、configurable等属性的作用,以及设置值属性时的注意事项,并给出了参考博客链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Object.defineProperty(obj, prop, descriptor)

descriptor的描述有两种:数据描述符和存取描述符。

数据描述符是一个具有值的属性,该值可能是可写的,也可能不是可写的。

存取描述符是有getter-setter函数描述的属性。

描述符必须是这两种形式之一,不能同时是两者。

可同时具

有的键值

configurable enumerable valuewritable get set 
数据描述符yes yes yes yes no no 
存取描述符yes yes no no yes yes 
默认值false false undefined false undefined undefined 

 

当writable属性设置为false时,该属性被称为“不可写”。它不能被重新分配。如果试图写入非可写属性,属性不会改变,也不会引发错误。

enumerable定义对象的属性是否可以在for...in循环和Object.keys()中被枚举。enumerable默认为false,如果直接赋值的方式(o.d=4)创建对象的属性,则这个属性的enumerable为true。

o.propertyIsEnumerable('a'); 获取对象的属性是否可枚举。

configurable特性表示对象的属性是否可以被删除,以及除value和writable特性外的其他特性是否可以被修改。

var o = {};

o.a = 1;

// 等同于 :

Object.defineProperty(o, "a", {

value : 1,

writable : true,

configurable : true,

enumerable : true

});

// 另一方面,

Object.defineProperty(o, "a", {

value : 1

});

// 等同于 :

Object.defineProperty(o, "a", {

value : 1,

writable : false,

configurable : false,

enumerable : false

});

 

记住,这些选项不一定是自身属性,如果是继承来的也要考虑。为了确认保留这些默认值,你可能要在这之前冻结 Object.prototype,明确指定所有的选项,或者通过 Object.create(null)将__proto__属性指向null。

注意:在对象上设置值属性时,如果原型上不存在这个属性,那么设置的值属性在对象上。然而,如果原型上一个不可写的属性被继承,那么它仍会防止修改对象上的属性。

function myclass() { }

myclass.prototype.x = 1;

Object.defineProperty(myclass.prototype, "y", {

writable: false,

value: 1

});

var a = new myclass();

a.x = 2;

console.log(a.x);// 2

console.log(myclass.prototype.x); // 1

a.y = 2; // Ignored, throws in strict mode

console.log(a.y); // 1

console.log(myclass.prototype.y); // 1

参考博客:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

转载于:https://www.cnblogs.com/Dida-1209/p/11038437.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值