function Person(name) {
this.name = name;
}
function changeName(newName) {
this.name = newName;
}
// 關鍵行:將全局函數 changeName 綁定到實例方法
Person.prototype.changeName = changeName;
// 或構造函數內綁定 (題主截圖模式)
function Person2(name) {
this.name = name;
this.changeName = changeName; // 每個實例都擁有獨立的函數引用
}
var myMother = new Person2("Bill Gates");
myMother.changeName("Ballmer"); // 正常調用
console.log(myMother.name); // "Ballmer"
構造函數內綁定 (this.changeName = changeName): Person2 實例 1 --> changeName (函數對象 A) Person2 實例 2 --> changeName (函數對象 B) // A === B 為 true (引用同一函數),但各自擁有屬性槽 原型綁定 (Person.prototype.changeName = changeName): Person.prototype --> changeName (函數對象) Person2 實例 1 --> __proto__ --> changeName Person2 實例 2 --> __proto__ --> changeName // 完全共享
class Person {
constructor(name) {
this.name = name;
}
// 定義在類體中,自動添加到原型
changeName(newName) {
this.name = newName;
}
}
const p = new Person("Bill");
p.changeName("Ballmer");
function Person(name) {
this.name = name;
// 箭頭函數捕獲構造函數調用時的 this (即新實例)
this.changeName = (newName) => {
this.name = newName;
};
}
// 優點:this 永遠綁定實例,即使作為回調傳遞也不會丟失
// 缺點:每個實例創建新函數對象,無法通過原型復用
const personMethods = {
changeName(newName) { this.name = newName; }
};
function Person(name) {
this.name = name;
Object.assign(this, personMethods); // 或 {...personMethods} 但需注意 this 綁定
}
`this.changeName = changeName` 的本質是**將獨立函數作為屬性賦值給實例**,使其調用時 `this` 指向該實例,從而能讀寫實例屬性。現代開發首選 **ES6 Class** 語法,自動處理原型掛載與 `this` 綁定,代碼更清晰、性能更優。