JS面向对象之属性描述符

属性描述符

JS 提供了一个内部数据结构,用来描述对象的值、控制其行为。称为属性描述符。

对象里存在的属性描述符有两种形式,数据描述符和存取描述符。

数据描述符

数据描述符是一个具有值的属性,数据描述符的键值如下:

  • value:该顺序对应的值,可以为任意有效的值(例如数值、对象、函数),默认为 undefined。
  • writable:值为 true/false,当为 true 时代表value能被改变。
  • configurable:值为 true/false,当为 true 时代表属性描述符才能被改变,该属性也能删除。默认为 false。
  • enumerable:值为 true/false,为 true 时才能出现在枚举属性中,默认为 false。

存取描述符

存取描述符由 getter-setter 函数对描述的属性,具有以下键值:

  • get:为属性提供 gitter 方法,若没有则为undefined。
  • set:为属性提供 setter 方法,若没有则为undefined。
  • configurable:值为 true/false,当为 true 时代表属性描述符才能被改变,该属性也能删除。默认为 false。
  • enumerable:值为 true/false,为 true 时才能出现在枚举属性中,默认为 false。

获取属性描述符

Object.getOwnPropertyDescriptor() 方法可以获取指定对象上一个属性的属性描述符。

语法结构:

Object.getOwnPropertyDescriptor(obj, prop);
  • obj:要获取的对象
  • prop:对象中的某个属性,String类型
  • 返回值:返回属性描述符对象,若 prop 参数的属性不存在则返回 undefined。

如下代码:

function Person(){
   
    this.name = 'hjj';
    this.sayMe = function () {
   
        console.log(this);
    }
}
p = new Person();
var result = Object.getOwnPropertyDescriptor(p, 'name');
console.log(result instanceof Object);

结果:

{ value: 'hjj', writable: true, enumerable: true, configurable: true }
true

可以看到boolean 类型的返回值都为 true,而上面描述中默认值为 false,这点需要注意。这也是为什么我们可以在对象中
删除属性删除方法的原因。

需要注意的是,通过定义对象(属性或方法)获取的是数据操作符

由于返回的是对象,所以可以调用其中的方法,如下代码所示:

function Person(){
   
    this.name = 'hjj';
    this.sayMe = function () {
   
        console.log(this);
    }
}
p = new Person();

var result = Object.getOwnPropertyDescriptor(p, 'name');
console.log(result.value);

结果:

hjj

设置属性描述符

Object.defineProperty() 方法为对象定义新属性、或修改现有的属性,并返回这个对象。

语法结构:

Object.defineProperty(obj, prop, descriptor);
  • obj,定义属性的对象
  • prop,定义或者修改的属性名
  • descriptor,属性修饰符
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值