JavaScript中公共方法应挂载在构造函数prototype上以实现共享,如Person.prototype.sayHi;class中普通方法自动挂原型,而实例内定义或箭头函数会导致重复创建、无法继承。

JavaScript 中用原型对象共享公共方法,关键在于把函数挂到构造函数的 prototype 上,而不是在构造函数内部用 this.method = function() {...} 定义。这样所有实例共用同一份函数,不重复创建,节省内存,也支持继承和动态扩展。
直接往 prototype 上添加方法
这是最直观、最常用的方式。构造函数定义后,直接给它的 prototype 赋值函数:
function Person(name) { this.name = name; }Person.prototype.sayHi = function() { return `Hi, I'm ${this.name}`; };- 之后
new Person('Alice')和new Person('Bob')都能调用sayHi(),且alice.sayHi === bob.sayHi为 true,说明是同一个函数引用。
class 语法中普通方法自动挂原型
ES6 的 class 是语法糖,其中定义的非静态、非箭头的普通方法,默认就挂载在类的 prototype 上:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
class Animal { constructor(type) { this.type = type; } speak() { return `${this.type} speaks`; } }-
Animal.prototype.speak就是那个函数;new Animal('cat').hasOwnProperty('speak')返回 false,说明它不在实例上,而在原型链上。
避开常见错误:别在实例上重复定义
以下写法会让方法变成每个实例私有,失去共享意义:
立即学习“Java免费学习笔记(深入)”;
- 构造函数里写:
this.speak = function() {...} - class 字段中用箭头函数:
speak = () => {...} - 或用函数表达式赋值:
speak = function() {...} - 这些都会导致每次
new都新建一个函数,无法被子类继承,也浪费内存。
验证共享与 this 的独立性
可以这样确认方法是否真正共享、this 是否正确绑定:
const a = new Person('A'); const b = new Person('B');a.sayHi(); // 输出 'Hi, I'm A'b.sayHi(); // 输出 'Hi, I'm B'console.log(a.sayHi === b.sayHi); // true- 函数是同一个,但每次调用时
this自动指向当前调用者——这正是原型共享的设计本意。

















