如何避免原型链上面的对象共享
在 JavaScript 中,避免原型链上的对象共享的核心思路是:确保每个实例拥有独立的属性副本,而不是直接引用原型链上的共享对象
在构造函数中初始化对象属性(推荐)
function MyClass() {
// 每个实例初始化时,都会创建新的独立对象
this.data = { value: 1 };
this.arr = [];
}
const obj1 = new MyClass();
const obj2 = new MyClass();
obj1.data.value = 2; // 只影响 obj1
obj1.arr.push(3); // 只影响 obj1
优点:简单直观,内存占用可控。 缺点:如果属性是方法,重复初始化可能浪费内存(但方法通常应定义在原型上)。
ES6 类语法 + 构造函数属性
利用 ES6 的 class 语法,在构造函数中直接定义实例属性
class MyClass {
constructor() {
this.data = { value: 1 };
this.arr = [];
}
}
const obj1 = new MyClass();
const obj2 = new MyClass();
obj1.data.value = 2; // 不影响 obj2
使用 Object.create(null) 断开原型链
通过 Object.create(null) 创建一个没有原型链的空对象,避免继承原型属性
function MyClass() {}
MyClass.prototype.data = { value: 1 };
const obj1 = Object.create(MyClass.prototype);
obj1.data = Object.create(null); // 创建一个无原型的独立对象
obj1.data.value = 1;
const obj2 = Object.create(MyClass.prototype);
obj2.data = Object.create(null);
obj2.data.value = 2;
console.log(obj1.data.value); // 1(独立)
console.log(obj2.data.value); // 2(独立)
适用场景:需要完全独立的对象结构,但操作稍显繁琐。