JS获取对象的所有属性(自身/原型属性、可枚举/不可枚举)

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));

 

posted @ 2022-12-31 14:31  未来的山大王  阅读(1612)  评论(0)    收藏  举报