一、什么是getter和setter?
在JavaScript中,getter和setter是特殊的屬性存取器(accessor properties),允許開發(fā)者通過函數(shù)控制對象屬性的讀取和賦值行為。它們并非直接操作屬性值,而是通過“中間層”實現(xiàn)邏輯封裝,使得代碼更靈活且易于維護。
-
Getter:當讀取屬性時觸發(fā),無需加括號調(diào)用,例如
obj.prop。 -
Setter:當賦值屬性時觸發(fā),例如
obj.prop = value。
二、 如何定義 Getter 和 Setter?
我們可以使用 Object.defineProperty() 方法或 ES6 的簡潔語法來定義 getter 和 setter。以下是兩種方法的示例:
使用 Object.defineProperty()
const person = {};
Object.defineProperty(person, 'name', {
get: function() {
return this._name;
},
set: function(value) {
this._name = value;
}
});
person.name = 'Alice'; // 調(diào)用 setter
console.log(person.name); // 調(diào)用 getter,輸出 'Alice'
使用 ES6 簡潔語法
class Person {
constructor(name) {
this._name = name;
}
get name() {
return this._name;
}
set name(value) {
this._name = value;
}
}
const person = new Person('Bob');
person.name = 'Charlie'; // 調(diào)用 setter
console.log(person.name); // 調(diào)用 getter,輸出 'Charlie'
三、為什么需要getter和setter?
1. 數(shù)據(jù)驗證與安全性
通過setter可以在賦值前添加驗證邏輯,防止非法數(shù)據(jù)污染對象。例如:
set age(value) {
if (typeof value !== 'number' || value < 0)
throw Error("年齡必須是非負數(shù)!");
this._age = value;
}
2. 封裝與計算屬性
Getter可以動態(tài)計算屬性值,例如根據(jù)width和height自動計算area:
get area() {
return this.width * this.height;
}
3. 懶加載:在訪問某個屬性時,可以延遲計算或加載數(shù)據(jù)。