JavaScript Guidebook

JavaScript 完全知识体系

Object.getOwnPropertyNames

Object.getOwnPropertyNames() 方法用于获取指定对象的所有自身 Property 的键名(包括不可枚举属性但不包括 Symbol 值作为名称的属性)组成的数组。

语法

语法:

Object.getOwnPropertyNames(o);

类型声明:

interface ObjectConstructor {
getOwnPropertyName(o: any): string[];
}

参数说明:

参数说明类型
o用于获取 Property 键名的目标对象object

返回值:

返回 Properties 键名组成的数组。

方法说明

如果只需要获取可枚举属性,可以使用 Object.keys 或用 for-in 语句(还会获取到原型链上的可枚举属性,不过可以使用 Object.prototype.hasOwnProperty 方法过滤)。

代码示例

数组

const foo = ['a', 'b', 'c'];
console.log(Object.getOwnPropertyNames(foo).sort());
// ['0', '1', '2', 'length']

类数组

// 类数组对象
const foo = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.getOwnPropertyNames(foo).sort());
// ['0', '1', '2']
// 使用 Array.forEach 输出属性名和属性值
Object.getOwnPropertyNames(foo).forEach(function (val, idx, array) {
console.log(`${val}:${foo[val]}`);
});
// 0:a
// 1:b
// 2:c

不可枚举属性

// 不可枚举属性
const foo = Object.create(
{},
{
getBar: {
value: function () {
return this.bar;
},
enumerable: false,
},
}
);
foo.bar = 1;
console.log(Object.getOwnPropertyNames(foo).sort());
// ['foo', 'getBar']

仅获取自有 Property

function SuperClass() {}
SuperClass.prototype.inheritedMethod = function () {};
function SubClass() {
this.prop = 5;
this.method = function () {};
}
SubClass.prototype = new SuperClass();
SubClass.prototype.prototypeMethod = function () {};
Object.getOwnPropertyNames(new SubClass());
// ['prop', 'method']

只获取不可枚举 Property

使用 Array.prototype.filter 方法,从所有的 Property 键名数组(使用 Object.getOwnPropertyNames 方法获取)中去除可枚举的属性(使用 Object.keys 方法获取),剩余的属性便是不可枚举的属性。

const enum_and_nonenum = Object.getOwnPropertyNames(target);
const enum_only = Object.keys(target);
const nonenum_only = enum_and_nonenum.filter(function (key) {
const indexInEnum = enum_only.indexOf(key);
if (indexInEnum === -1) {
return true;
} else {
return false;
}
});

参考资料