javascript 中 symbol 作为原型属性时,主要用于定义不可见、不冲突的私有或内部行为,通过 object.getownpropertysymbols() 获取。它不会出现在 for...in 循环或 object.keys() 中,但可以通过反射 api 访问。

Symbol 在原型链中的查找机制是怎样的
当访问原型上的 Symbol 属性时,引擎会沿着原型链向上查找,找到第一个定义的属性即返回其值。这种查找机制与字符串键名一致,但 Symbol 具有唯一性,确保不同代码块创建的 Symbol 不会意外覆盖。

const sym = Symbol('id');
function Person(name) {
this.name = name;
}
Person.prototype[sym] = 'hidden-id';
const p = new Person('Alice');
console.log(p[sym]); // 'hidden-id'
console.log(Object.getPrototypeOf(p)[sym]); // 'hidden-id'
如何遍历和访问原型中的 Symbol 属性
要访问原型中的 Symbol 属性,必须使用 Object.getOwnPropertySymbols() 方法。该方法返回一个包含对象自身所有 Symbol 键的数组,结合 Object.getPrototypeOf() 可以获取原型上的 Symbol 属性。

const sym1 = Symbol('type');
const sym2 = Symbol('version');
function Item() {}
Item.prototype[sym1] = 'A';
Item.prototype[sym2] = 1.0;
const item = new Item();
const protoSyms = Object.getOwnPropertySymbols(Object.getPrototypeOf(item));
protoSyms.forEach(s => console.log(s, item[s]));
基于程序中某个输入、条件或结果的具体问题
如果原型上同时定义了同名 Symbol 和字符串键,访问时会优先返回 Symbol 对应的值吗?不会,因为 Symbol 和字符串是不同的键类型,它们互不影响。但如果两个不同的 Symbol 被用作键,它们也是独立的,不会冲突。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











