原型对象通过将方法挂载到构造函数的 prototype 上实现共享,避免实例重复创建函数;构造函数内用 this.method 定义会导致每个实例拥有独立函数副本,内存占用线性增长;正确写法是 Star.prototype.method = function(){},注意不可字面量重写 prototype 以免丢失 constructor,且引用类型属性会被共享。

原型对象通过把方法挂载到构造函数的 prototype 属性上,让所有实例共享同一份方法定义,从而避免每次创建新对象时都重复生成函数对象。
为什么构造函数内部定义方法会重复创建
在构造函数中直接用 this.method = function(){...} 定义方法时,每个实例都会拥有独立的函数副本:
- 函数在 JavaScript 中是对象,每次执行都会新建一个函数实例
-
obj1.sayName === obj2.sayName返回false - 内存占用随实例数量线性增长,影响性能
原型对象如何统一管理方法
将方法写在构造函数的 prototype 上,所有实例通过原型链访问同一个函数:
- 构造函数默认的
prototype是一个对象,自带constructor属性 - 实例内部的
__proto__自动指向该prototype - 调用方法时,JS 引擎沿原型链向上查找,最终命中
Star.prototype.sing -
ldh.sing === zxy.sing返回true,说明是同一个函数引用
实际写法对比
错误写法(重复创建):
this.name = name;
this.sing = function() { console.log('唱歌'); };
}
正确写法(原型共享):
function Star(name) {this.name = name;
}
Star.prototype.sing = function() { console.log('唱歌'); };
注意事项
使用原型方式需注意几点:
- 不能用字面量重写整个
prototype,否则会丢失默认的constructor指向 - 若必须重写,应手动补回:
Star.prototype.constructor = Star - 原型上的属性如果是引用类型(如数组、对象),会被所有实例共享,修改会影响彼此
- 实例自身属性优先级高于原型属性,可安全覆盖同名属性而不影响其他实例
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











