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));
标签:Symbol,Object,JS,枚举,key,不可枚举,属性 From: https://www.cnblogs.com/webtown/p/17016625.html