var o = {a:1, b: 'bb'};
for(var i in o){
console.log(o[i]);// 1 bb
}
// 由于原生继承的属性默认不可枚举,所以只取得自定义的属性 a:1, b:'bb'
var o = {a:1};
Object.defineProperty(o,'a',{ enumerable:false });
for(var i in o){
console.log(o[i]); // undefined
}
# propertyIsEnumerable()方法用于判断对象的属性是否可枚举
var o = { a:1 };
console.log(o.propertyIsEnumerable('a')); // true
对象的属性描述
对象的属性描述符是用来描述对象的值、是否可配置、是否可修改以及是否可枚举...
数据属性
数据属性包含一个数据值的位置, 在这个位置可以读取和写入值。 数据属性有4个特性:
访问器属性
对象属性是名字、值和一组属性描述符构成的。而属性值可以用一个或两个方法替代,这两个方法就是getter和setter。 而这种属性类型叫访问器属性:
描述符方法(都来自于 Object 构造函数)
Object.getOwnPropertyDescriptor(obj, prop)
用于查询一个属性的描述符,并以对象的形式返回
Object.defineProperty(obj, prop, config)
用于创建或配置对象的一个属性的描述符,返回配置后的对象 使用该方法创建或配置对象属性的描述符时,如果不针对该属性进行描述符的配置,则该项描述符默认为false
Object.defineProperties()
用于创建或配置对象的多个属性的描述符,返回配置后的对象
Object.create()
使用指定的原型和属性来创建一个对象
描述符详解
可配置性(Configurable)
可配置性决定是否可以使用delete删除属性,以及是否可以修改属性描述符的特性,默认值为true
可写性(writable)
可写性决定是否可以修改属性的值,默认值为true
可枚举性(Enumerable)
可枚举性决定属性是否出现在对象的属性枚举中,具体来说,for-in循环、Object.keys方法、JSON.stringify方法是否会取到该属性 用户定义的普通属性默认是可枚举的,而原生继承的属性默认是不可枚举的
get和set
get是一个隐藏函数,在获取属性值时调用。 set也是一个隐藏函数,在设置属性值时调用,它们的默认值都是undefined。 Object.definedProperty()中的get和set对应于对象字面量中get和set方法
Object.defineProperty(o,'a',{ get: function(){ return 22; } }) o.a // 22
只设置set方法,而不设置get方法,则对象属性值为undefined
var o = { set a(val) { return 2; } }
o.a = 1; console.log(o.a); // undefined
Object.defineProperty(o,'a',{ set: function(){ return 2; } }) o.a = 1; console.log(o.a); // undefined
set和get方法一起出现时
var o = { get a(){ return this._a; }, set a(val){ this._a = val + 100; } } o.a = 1; // 设置值 console.log(o.a); // 访问,获取值 101
Object.defineProperty(o,'a',{ get: function(){ return this._a; }, set: function(val){ this._a = val + 100; } }) o.a = 1; console.log(o.a); // 101