JavaScript 对象

Author Avatar
LI Liangmin 8月 01, 2017

对象的属性有属性描述符的对象,即使没有直接给出。

       var obj = {
              name: 'objcet'
       };

       Objcet.getOwnpropertyDescriptor(obj, "name");   // 为:{value: "objcet", configurable: true, writable: true, enumerable: true}

       //直接给出
       Object.defineProperty(obj, "tool", {
            value: "tool"
       });

       Objcet.getOwnpropertyDescriptor(obj, "tool");   // 为:{value: "tool", configurable: false, writable: false, enumerable: false}

这里默认含有一个对象描述符对象。且各项默认为true。我们可以对其进行多项操作。若我直接给出呢?这是若不在对象中明确给出,那么就会默认为false。

1、这四个值重要吗? value可以直接修改值,writable决定是否可以写入,enumerable决定for in 语句、Objcet.keys()、o.propertyIsEnumerable(),configurable决定是否可以删除属性值以及是否可以配置。

2、 浅复制下不会对原有的描述符的属性进行复制,也就是说其中的值默认为true。 访问器属性:它们与value、writable是冲突的,只能给出一种形式。

         var obj = {
                get value () {
                 return this._value;  
                },
                set value (v) {
                 this._value = v; 
                }
         };
         //这是的value是不可枚举、不可配置的。_value是可以枚举配置的。

枚举
for…in 语句会以[[prototype]]链的方式枚举但枚举的是属性名。

        var arr = [1, 2, 3];
        for (var i in arr) {
        console.log(i);
        }
        //值为:"0"、"1"、"2"

另:Object.keys()、Objcet.getOwnPropertyNames()不会查找原型链。

遍历
数组内置@@iterator从而可以遍历得到值,对于一个对象可以认为建立@@iteraror来与for of 语句搭配使用。下面是一个例子。

    var random = {
            [Symbol.iterator]: function () {
                    return {
                          next: function () {
                                 return {
                                        value: Math.random()
                                 }; 
                          }
                    };
            }
    };