問題混淆了兩組概念:
JavaScript 中所有對象類型(Object, Array, Function, Date, RegExp 等)均為引用類型,變量存儲的是引用(地址)。
let obj1 = { name: "張三" }; // obj1 存儲引用 addr1
let obj2 = obj1; // obj2 複製引用 addr1,指向同一實體
obj2.name = "李四";
console.log(obj1.name); // "李四" —— 修改影響共享實體
// 原始類型為值類型
let a = 10;
let b = a; // 複製值 10
b = 20;
console.log(a); // 10 —— 互不影響
prototype 是對象的一個引用
function Person(name) {
this.name = name;
}
Person.prototype.sayHi = function() {
console.log("Hi, " + this.name);
};
let p1 = new Person("張三");
let p2 = new Person("李四");
console.log(p1.sayHi === p2.sayHi); // true
console.log(p1.__proto__ === Person.prototype); // true
console.log(p2.__proto__ === Person.prototype); // true
Person.prototype 是一個對象實體(包含 sayHi 方法)。p1.__proto__ 和 p2.__proto__ 都是指向該實體的引用。JS 是基於原型的對象語言,非面向類。通過構造函數 + 原型模擬類行為:
Person 類比「類」。new Person() 創建實例,實例 __proto__ 引用構造函數的 prototype。「原型是對象的一個引用」準確含義:實例內部隱藏屬性 [[Prototype]] (即 __proto__) 存儲著指向原型對象實體的引用地址。理解引用機制是掌握 JS 共享、變異、原型繼承的關鍵。