JavaScript -- 理解对象的属性

备注:本文长期修改
说明:ECMAScript中属性有两种:数据属性和访问器属性。

属性描述符

1. 数据属性

特性名称 描述 默认值
value 设置属性的值 undefined
writable 设置是否可修改值 true
enumerable 表示能否通过for-in循环返回属性。 true
configurable
  1. 表示能否通过 delete 删除属性从而重新定义属性
  2. 能否修改属性的特性
  3. 能否把属性修改为访问器属性
true

在使用 Object.definePropertyObject.definePropertiesObject.create 函数的情况下添加数据属性,writable、enumerable和configurable默认值为 false

使用 对象字面量 创建的属性,writable、enumerable和configurable特性默认为true。

2. 访问器属性

特性名称 描述 默认值
Get 在读取属性时调用的函数 undefined
Set 在写入属性时调用的函数 true
enumerable 是否可以被枚举(使用for...in或Object.keys()) true
configurable
  1. 表示能否通过 delete 删除属性从而重新定义属性
  2. 能否修改属性的特性
  3. 能否把属性修改为访问器属性(目标属性是否可以再次设置特性)
true
var obj = {};
Object.defineProperty(obj, "newKey", {
    get:function (){} | undefined,
    set:function (value){} | undefined
    configurable: true | false
    enumerable: true | false
});
注意:当使用了getter或setter方法,不允许使用writable和value这两个属性

ECMAScript 5中操作属性特性的方法有3个:

1. Object.defineProperty()

语法:

Object.defineProperty(obj, prop, descriptor)

参数列表:

obj:必需。目标对象 
prop:必需。需定义或修改的属性的名字
descriptor:必需。目标属性所拥有的特性

返回值:

传入函数的对象。即第一个参数obj
示例
var obj = {};

// Object.defineProperty(对象,属性,属性描述符)
Object.defineProperty(obj, "name", {
    get: function(){
        return this._name;  //在 get 和 set 中使用访问属性必须加 "_"
    },
    set: function(val){
        if(Array.isArray(val)){
            this._name = val;
        } else{
            this._name = "不是数组不能赋值";
        }
    },
    enumerable: true,       // 表示可枚举的
    configurable: true      // 是否可删除属性
});

// Object {get: function, set: function, enumerable: true, configurable: true}
console.log(Object.getOwnPropertyDescriptor(obj, 'name')); 

obj.name = "111";
console.log(obj.name);

猜你喜欢

转载自www.cnblogs.com/hm0818/p/9142433.html