prototype是函数的属性,指向供实例共享方法的原型对象;实例通过__proto__访问它,形成原型链;可实现继承和扩展内置对象,但需谨慎。

prototype 是 JavaScript 中让多个对象“共用一套方法”的核心机制。它不是魔法,而是一种节省内存、组织代码的实用设计。
prototype 是函数才有的属性,用来存共享内容
每个函数(除了箭头函数)一创建,就自带一个 prototype 属性,它指向一个普通对象。这个对象就是“原型对象”,专门放那些所有实例都应该共用的东西。
- 构造函数里写的
this.name = name,每次new都会新建一份,属于“私有数据” - 写在
Person.prototype.sayHi = function(){...}里的方法,所有new Person()出来的实例都指向同一份,不重复占用内存 - 你可以把它想象成“公共工具箱”:造十个机器人,不用给每个都配一套螺丝刀,统一放在车间中央的工具架上,大家去拿就行
实例靠 __proto__ 找到 prototype
当你写 const p = new Person('Alice'),JavaScript 会悄悄让 p.__proto__ 指向 Person.prototype。这样你调用 p.sayHi() 时,引擎先查 p 自身有没有 sayHi;没有,就顺着 __proto__ 去 Person.prototype 找——这个查找过程就是原型链的起点。
-
__proto__是实例对象的内部链接(非标准但广泛支持),prototype是构造函数的属性,二者方向相反、角色不同 - 验证方式:
p.__proto__ === Person.prototype返回 true - 别直接改
__proto__,应通过构造函数的prototype来统一管理
用 prototype 实现继承,本质是“链起来”
让子类复用父类的方法,不需要复制代码,只需把子类的 prototype 指向父类的一个实例:
立即学习“Java免费学习笔记(深入)”;
-
Dog.prototype = new Animal();—— Dog 的实例就能用Animal.prototype上的方法(比如eat()) - 之后再加
Dog.prototype.bark = function(){...},就只属于 Dog,不影响 Animal - 现代写法更推荐
Object.setPrototypeOf(Dog.prototype, Animal.prototype)或 ES6 的class extends,语义更清晰
可以给内置对象“加功能”,但要谨慎
因为 Array.prototype、String.prototype 等也是普通原型对象,所以你能往上面挂新方法:
String.prototype.firstChar = function(){ return this[0]; };- 之后所有字符串都能用:
"hello".firstChar()→"h" - ⚠️ 注意:这是全局修改,可能与其他库冲突;生产环境建议封装成工具函数,或使用 polyfill 方式条件添加


















