var s1 = Symbol('s1')
var s2 = Symbol('s2')
var obj= {
a: 'a1', // 自身属性 可枚举
b: 'b1', // 自身属性 可枚举
[s1]: 's1s1s1s1', // 自身属性 Symbol类型不可枚举
};
// 原型链属性 可枚举
Object.prototype.c = 111
// 原型链属性 不可枚举
Object.defineProperty(Object.prototype, 'd', {
val: 'dddd'
})
// 原型链属性 不可枚举 Symbol类型
Object.defineProperty(Object.prototype, s2, {
val: 's2s2s2s2'
})
// 枚举 自身属性
for (key in obj) {
console.log('key', key);
// key a
// key b
// key c
/*没有[Symbol(s1)],因为Symbol类型是不可枚举的*/
}
console.log(obj); // Symbol是自身属性可以显示
// { a: 'a1', b: 'b1', [Symbol(s1)]: 's1s1s1s1' }
// JS获取对象属性的各种方式和区别(自身/原型属性、可枚举/不可枚举)
function getAllkeys (obj) {
const keys = []
let temp = obj
while (temp) {
keys.push.apply(keys, Object.getOwnPropertyNames(temp))
keys.push.apply(keys, Object.getOwnPropertySymbols(temp))
temp = Object.getPrototypeOf(temp) // 返回指定对象的原型(内部[[Prototype]]属性的值)
}
return keys
}
console.log(getAllkeys(obj));