JavaScript中类属性与原型属性的覆盖规则详解

张开发
2026/4/20 0:40:33 15 分钟阅读

分享文章

JavaScript中类属性与原型属性的覆盖规则详解
实例属性优先于原型属性访问类字段声明本质是实例属性static属性属于类本身而非原型链。在 JavaScript 中类属性即直接定义在类体内的 实例属性和原型属性即定义在类的 prototype 上的方法或通过 static 定义的静态成员遵循明确的属性访问与覆盖逻辑。理解它们的优先级、作用域和赋值行为是避免“方法不生效”“属性看似被修改却没变”等常见问题的关键。实例属性优先于原型属性访问当通过实例访问一个属性或方法时JavaScript 引擎会按以下顺序查找先检查实例自身是否拥有该属性即在 this 上直接定义如类字段初始化 value 123 或构造函数中 this.value ... 若不存在则沿 __proto__ 链向上查找在 Constructor.prototype 上找例如类中定义的 method() {} 再往上是 Object.prototype最后到 null这意味着即使原型上已有同名方法只要你在实例上直接赋值obj.name xxx后续访问 obj.name 就永远取实例值不再查原型——这是“覆盖”的实质不是删除原型属性而是遮蔽shadowing。类字段声明public field本质是实例属性ES2022 起支持的类字段语法如 count 0会在每次构造函数执行时为每个实例创建独立副本立即学习“Java免费学习笔记深入”class Counter { count 0; // ? 每个实例都有自己的 count inc() { this.count; }}const a new Counter();const b new Counter();a.inc(); console.log(a.count); // 1console.log(b.count); // 0 —— 互不影响这类属性不会出现在原型上Counter.prototype.hasOwnProperty(count) 返回 false。它和在构造函数中写 this.count 0 效果一致只是更简洁。 唱鸭 音乐创作全流程的AI自动作曲工具集 AI 辅助作词、AI 自动作曲、编曲、混音于一体

更多文章