object.getownpropertysymbols() 通过只返回对象自身拥有的 symbol 属性键,完全排除了原型链上的 symbol 属性。要获取包括原型链在内的所有 symbol 属性,需要手动遍历 [[prototype]] 链并收集这些属性。

如何获取对象自身的所有 Symbol 属性
Object.getOwnPropertySymbols() 仅返回调用该方法的对象实例上直接定义的 Symbol 属性,不会查找或返回其原型链上的任何 Symbol 属性。这是 ECMAScript 规范中定义的标准行为,旨在提供对对象内部状态的精确访问。

const symSelf = Symbol('self');
const obj = {};
obj[symSelf] = 'own value';
console.log(Object.getOwnPropertySymbols(obj)); // [Symbol(self)]
console.log(Object.getOwnPropertySymbols(obj).length); // 1如何遍历原型链以获取所有 Symbol 属性
由于内置方法不处理原型链,开发者必须编写自定义逻辑来递归或迭代地收集从当前对象到 null 之间所有层级上的 Symbol 属性。这通常涉及使用 Object.getPrototypeOf() 来获取父级原型,并重复应用 getOwnPropertySymbols。
立即学习“Java免费学习笔记(深入)”;

function getAllSymbols(obj) {
let symbols = Object.getOwnPropertySymbols(obj);
let proto = Object.getPrototypeOf(obj);
while (proto) {
symbols = symbols.concat(Object.getOwnPropertySymbols(proto));
proto = Object.getPrototypeOf(proto);
}
return symbols;
}
const symProto = Symbol('proto');
const parent = {};
parent[symProto] = 'parent value';
const child = Object.create(parent);
child[symSelf] = 'child value';
console.log(getAllSymbols(child)); // [Symbol(self), Symbol(proto)]为什么原型链上的 Symbol 不被自动包含
JavaScript 的设计哲学将“自身属性”与“继承属性”严格区分。Object.getOwnPropertySymbols 的行为与 Object.keys 和 Object.getOwnPropertyNames 保持一致,即只关注对象自身的可枚举或非 enumerable 属性,而不涉及继承部分。这种设计确保了 API 的确定性和性能,避免在每次调用时都进行昂贵的原型链搜索。如果开发者需要完整的 Symbol 集合,必须显式地实现遍历逻辑,正如上一节代码所示。


















