码迷,mamicode.com
首页 > 其他好文 > 详细

属性描述对象

时间:2017-07-25 19:48:13      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:attribute   family   删除   define   字符   getter   判断   对象   输出   

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()方法。

 

属性描述对象

标签:attribute   family   删除   define   字符   getter   判断   对象   输出   

原文地址:http://www.cnblogs.com/momei/p/7235654.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!