属性描述对象

Posted 墨.眉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了属性描述对象相关的知识,希望对你有一定的参考价值。

javascript 的内部数据结构,用来描述一个对象的属性的行为,操控它的行为。这被称为“属性描述对象”(attributes object)。

{
value:momei,      //存放该属性的属性值,默认为undefined
writable:false,      //存放一个布尔值,表示属性值是否可更改,默认值为true。  
enumerable:true,    //存放一个布尔值,表示该属性是可枚举的,默认为true。
configurable:false,   //存放一个布尔值,表示“可配置性”,默认为true。控制属性描述的可写行、性。
get:undefined,      //存放一个函数,表示该属性的取值函数(getter),默认为undefined。
set:undefined       //存放一个函数,表示该属性的存值函数(setter),默认值undefined。
} 

Object.defineProperty() 方法接受三个参数,第一个是属性所在的对象,第二个是属性名(它应该是一个字符串),第三个是属性的描述对象。

Object.defineProperty(object, propertyName, attributesObject)

如果一次性定义或修改多个属性,可以使用Object.defineProperties() 方法。

 

Object.getOwnPropertyDescriptor()  方法可以读出对象自身属性的属性描述对象。

var infor = { name: ‘墨眉‘ };

Object.getOwnPropertyDescriptor(infor, ‘name‘);

// 输出 Object {value: "墨眉", writable: true, enumerable: true, configurable: true}

 

属性描述对象的属性,被称为“元属性”,因为它可以看作是控制属性的属性。

可枚举性(enumerable):

  • 只有可枚举的属性,才会被for...in循环遍历。
  • 原生集成的属性都是不可枚举的。
var o = {a: 1, b: 2};
o.c = 3;
Object.defineProperty(o, ‘d‘, {
  value: 4,
  enumerable: false
});
// 输出Object {a: 1, b: 2, c: 3, d: 4}

for(var key in o) {
    console.log(o[key]);
}

//输出 1,2,3      ( d 不可枚举 )

 

可配置型(configurable):

  • 可配置性(configurable)决定了是否可以修改属性描述对象。
  • 当configurable为false的时候,value、writable、enumerable和configurable都不能被修改。
var conf = Object.defineProperty({}, ‘p‘, {
  value: 1,
  writable: false,
  enumerable: false,
  configurable: false
});

Object.defineProperty(conf ,‘p‘, {value: 2})           // TypeError: Cannot redefine property: p

Object.defineProperty(conf ,‘p‘, {writable: true})       // TypeError: Cannot redefine property: p

Object.defineProperty(conf ,‘p‘, {enumerable: true})   // TypeError: Cannot redefine property: p

Object.defineProperties(conf ,‘p‘,{configurable: true})  // TypeError: Cannot redefine property: p

 

可写性(writable):

  • writable决定了属性的值(value)是否可以被更改。
var obj = {};
Object.defineProperty(obj, ‘a‘, {
  value: 37,
  writable: false
});

obj.a // 37
obj.a = 25;
obj.a // 37

 

Object.getOwnPropertyNames()  方法返回直接定义在某个对象上面的全部属性的名称,而不管该属性是否可枚举。

Object.prototype.propertyIsEnumerable() 判断一个属性是否可以枚举。

 

存取器(accessor)

  • 除了直接定义,属性还可以用存取器(accessor)定义。
  • 存值函数称为setter,使用set命令;取值函数称为getter,使用get命令。

控制对象状态

  • Object.preventExtensions() 可以是的一个对象无法再添加行的属性。
    • Object.isExtensible() 方法用于检查一个对象是否使用了Object.preventExtensions() 方法。也就是说,检查是否可以为一个对象添加属性。
  • Object.seal() 使得一个对象既无法添加新属性,也无法删除旧属性。
    • Object.isSealed() 方法用于检查一个对象是否使用了Object.seal() 方法
  • Object.freeze() 方法可以使得一个对象无法添加新属性、无法删除旧属性、也无法改变属性的值、使得这个对象实际上变成常量。
    • Object.isFrozen()方法用于检查一个对象是否使用了Object.freeze()方法。

 

以上是关于属性描述对象的主要内容,如果未能解决你的问题,请参考以下文章

26.Qt Quick QML-RotationAnimationPathAnimationSmoothedAnimationBehaviorPauseAnimationSequential(代码片段

无法在对象数组上读取未定义的属性“push”

python之路之前没搞明白4面向对象(封装)

使用嵌套片段和动画对象

VSCode自定义代码片段12——JavaScript的Promise对象

VSCode自定义代码片段12——JavaScript的Promise对象