JS获取对象属性方法

147 阅读1分钟
原型链(是否可以获取原型链上的属性)可枚举(是否可以获取不可枚举的属性)Symbols(是否可以获取Symbols标记的属性)
for...intruefalsefalse
Object.keys(obj)falsefalsefalse
Object.getOwnPropertyNames(obj)falsetruefalse
Reflect.ownKeys(obj)falsetruetrue
const animal = {
  A: 1,
  B: 2,
  C: 3,
}
const cat = {
  D: 4,
  E: 5,
  [Symbol()]: 6,
}

cat.__proto__ = animal
Object.defineProperty(cat, "E", { enumerable: false }); //定义E属性为不可枚举

for (let attrs in cat) {
  console.log("for...in:", attrs) // A,B,C,D
}
console.log("Object.keys:", Object.keys(cat)) // [ 'D' ]
console.log("Object.getOwnPropertyNames:", Object.getOwnPropertyNames(cat)) // [ 'D', 'E' ]
console.log("Reflect.ownKeys:", Reflect.ownKeys(cat))  //  [ 'D', 'E', Symbol() ]

hasOwnProperty

console.log(cat.hasOwnProperty('A'))
console.log(cat.hasOwnProperty('B'))
console.log(cat.hasOwnProperty('C'))
console.log(cat.hasOwnProperty('D'))
console.log(cat.hasOwnProperty('E'))
console.log(cat.hasOwnProperty(Symbol()))
console.log(cat.hasOwnProperty('A'))
console.log(cat.hasOwnProperty('toString'))
console.log(cat.hasOwnProperty('hasOwnProperty'))

打印结果:falsefalsefalsetruetruefalsefalsefalsefalse,hasOwnProperty可以获取自身以及不可枚举属性,继承而来的属性返回false