javascript通过原型链实现属性共享,即多个实例共用构造函数prototype上的属性和方法;访问时按实例→构造函数原型→object.prototype→null动态查找;避免实例遮蔽以保持共享有效性。

JavaScript 通过原型链实现属性共享,本质是让多个实例对象“共用”同一个原型对象上的属性和方法,而不是各自重复创建。这既节省内存,又天然支持继承行为。
把共享内容放在构造函数的 prototype 上
构造函数本身不存储实例间共用的逻辑,它的 prototype 属性才是共享区域。只要把方法或可读属性写在 Constructor.prototype 上,所有通过 new Constructor() 创建的实例都能访问到。
- 例如:
function Person(name) { this.name = name; }中,name是每个实例独有的;但Person.prototype.sayHi = function() { console.log('Hi, ' + this.name); };这个方法只存一份,所有Person实例都通过原型链找到它 - 访问时:调用
p1.sayHi(),引擎先查p1自身——没这个方法,就顺着p1.__proto__(即Person.prototype)找到并执行
原型链自动提供向上查找能力
属性访问不是“复制”,而是动态查找。当读取一个属性时,JavaScript 按照 实例 → 构造函数原型 → Object.prototype → null 的顺序逐级搜索,直到命中或终止。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Array.prototype.push能被所有数组使用,是因为[].__proto__ === Array.prototype,而Array.prototype.__proto__ === Object.prototype - 哪怕后期往
Array.prototype加新方法,已有数组也能立刻用上——这是运行时动态生效的共享
避免在实例上覆盖共享属性
如果直接给实例赋值同名属性(如 p1.sayHi = function(){...}),就会在实例自身创建一个“遮蔽项”,后续访问将不再走原型链,导致共享失效。
- 这是常见误操作:本想修改行为,结果只改了单个实例
- 真正要统一修改,应始终操作
Constructor.prototype或用Object.setPrototypeOf()调整原型指向
用 Object.create 显式构建原型关系
不依赖构造函数也能组织共享结构。比如想让 dog 复用 animal 的 eat 方法,可以直接用 Object.create(animal) 让 dog 的 [[Prototype]] 指向 animal。
- 此时
dog.__proto__ === animal,dog.eat()就会查到animal.eat - 这种模式更贴近“基于原型”的原始设计,也常用于类式继承的底层实现(如
class B extends A编译后就是类似逻辑)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










