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']
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']
使用 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;}});