对象键名操作的三种姿势
- for…in...
- Object.keys()
- Object.getOwnPropertyNames();
姿势对比分析
1、for…in...
沿原型链
遍历所有可枚举
的属性key。
function ParentObj() {}
ParentObj.prototype.a = function() {};
function ChildObj() {
this.b = 'hello b';
Object.defineProperty(this, 'm', {
enumerable: false,
value: 'the m is enumerable'
})
this.c = function() {};
}
ChildObj.prototype = new ParentObj();
ChildObj.prototype.d = function() {};
var keys = [];
for(var key in new ChildObj) {
keys.push(key);
}
console.log(keys);
2、Object.keys()
遍历对象自身
具有(非原型链上继承得来的)且可枚举
的属性key。
...
console.log(Object.keys(new ChildObj()));
3、Object.getOwnPropertyNames()
遍历对象自身
具有(非原型链上继承得来的)可枚举
及不可枚举
的属性key。
...
console.log(Object.getOwnPropertyNames(new ChildObj()));
应用
1、用for…in…实现Object.keys()
...
var keys = [];
var obj = new ChildObj;
for(var key in obj) {
obj.hasOwnProperty(key) && keys.push(key);
}
console.log(keys);
2、获取一个对象自身中所有不可枚举的属性key
var obj = Object.create({}, {
a: {
enumerable: true,
value: 1
},
b: {
enumerable: false,
value: 2
},
c: {
enumerable: true,
vaule: 3
},
d: {
enumerable: false,
value: 4
}
});
var enumKeys = Object.keys(obj);
var enumNoenumKeys = Object.getOwnPropertyNames(obj);
var noenumKeys = enumNoenumKeys.filter((key) => {
return enumKeys.indexOf(key) < 0;
})
console.log(noenumKeys);
参考链接
- 细说JavaScript中对象的属性和方法
- MDN——Object.getOwnPropertyNames()