Object.getOwnPropertyNames()
语法
getOwnPropertyNames(o: any): string[];
描述
方法返回一个由指定对象的所有自身属性的属性名组成的数组。
包括不可枚举属性
但不包括 Symbol 值作为名称的属性
不会获取到原型链上的属性
当不存在普通字符串作为名称的属性时返回一个空数组
示例
const obj = {
firstName: 'yancey',
lastName: 'leo',
[Symbol('age')]: '18',
greeting() {
return `Hello, ${this.firstName}!`;
},
};
// lastName 不可枚举
Object.defineProperty(obj, 'lastName', {
value: 'leo',
enumerable: false,
});
Object.getOwnPropertyNames(obj); // ['firstName', 'lastName', 'greeting']
该方法同样适用于数组,值得注意的是该方法会返回一个 length
属性。
Object.getOwnPropertyNames(['a', 'b', 'c']); // ['0', '1', '2', 'length']
该方法不会获取到原型链上的属性,但能获得该对象自身原型上的属性。
function Dog(name, color) {
this.name = name;
this.color = color;
}
Dog.prototype.bark = function() {
return '汪汪~';
};
const husky = new Dog('旺财', 'pink');
husky.say = function() {
return 'say something...';
};
Object.getOwnPropertyNames(husky); // ['name', 'color', 'say']
扩展
在 ES5 中,如果参数不是一个原始对象类型,那么它会导致 TypeError。在 ES6+ 中,非对象参数被强制转换为对象。
// TypeError: "foo" is not an object (ES5)
Object.getOwnPropertyNames('foo');
// ES6+
// 通过装箱操作,字符串 foo 被转换成了 {'0': 'f', '1': 'o', '2': 'o'}
Object.getOwnPropertyNames('foo'); // ['length', '0', '1', '2']