对象的属性有属性描述符的对象,即使没有直接给出。
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。
问题是这四个值重要吗?
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() }; } }; } };
原文:http://www.cnblogs.com/hustliliangmin/p/5998464.html