for/in:
是ES3中的方法,用来遍历对象(集合)的方法;
不过,for/in 会输出自身以及原型链上可枚举的属性,可以使用 hasOwnProperty 来过滤原型链上的属性
Object.keys():
是ES5中方法,用来获取对象自身可枚举的属性键
原型中属性和设置了不可枚举的属性,都获取不到
效果类似 for in+hasOwnProperty
Object.getOwnPropertyNames()
是ES5中方法,用来获取对象自身的全部属性名
不论自身对象是否设置了可枚举,都可以获取到
扩展:这边借鉴别人总结的对象的属性和方法
(1) Object.create
创建一个拥有指定原型和若干个指定属性的对象
Object.create(Object.prototype, {
a: {
value: 1,
writable: true,
configurable: true
}
})
(2) Object.defineProperty
直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象。
Object.defineProperty(obj, 'key', {
enumerable: false, // 能否被枚举
configurable: false, // 能否被改变
writable: false, // 能否可写
value: 'static'
})
(3) Object.defineProperties
在一个对象上添加或修改一个或者多个自有属性,并返回该对象。
var obj = {};
Object.defineProperties(obj, {
'property1': {
value: true,
writable: true
},
'property2': {
value: 'hello',
writable: false
}
})
(4) Object.getPrototypeOf
返回指定对象的原型(也就是该对象内部属性[Prototype]的值)
Object.getPrototypeOf({}) === Object.prototype
ES5之前,要达到上面同样的方法,只能使用 constructor
(5) Object.keys
Object.keys() 方法会返回一个由给定对象的所有可枚举自身属性的属性名组成的数组,数组中属性名的排列顺序和使用for-in循环遍历该对象时返回的顺序一致(两者的主要区别是 for-in 还会遍历出一个对象从其原型链上继承到的可枚举属性)
(6) Object.getOwnPropertyNames
Object.getOwnPropertyNames()方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性)组成的数组。
其和Object.keys的区别就是能够获取自身的全部属性,包括不可枚举属性。
(7) Object.preventExtensions
让一个对象变的不可扩展,也就是永远不能再添加新的属性。
Object.preventExtensions(obj)
(8) Object.isExtensible
判断一个对象是否是可扩展的(是否可以在它上面添加新的属性)。
(9) Object.seal
让一个对象密封,并返回被密封后的对象
密封对象是指那些不能添加新的属性,不能删除已有属性,以及不能修改已有属性的可枚举性、可配置性、可写性,但可能可以修改已有属性的值的对象。
(10) Object.isSealed
判断一个对象是否是密封的(sealed)。
(11)Object.freeze
冻结一个对象。冻结对象是指那些不能添加新的属性,不能修改已有属性的值,不能删除已有属性,以及不能修改已有属性的可枚举性、可配置性、可写性的对象。也就是说,这个对象永远是不可变的。该方法返回被冻结的对象。
(12)Object.isFrozen
Object.isFrozen() 方法判断一个对象是否被冻结(frozen)
(13) Object.assign
把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。