我們知道,一個對象可以擁有屬性。在過去,我們只要有了對象的引用,就可以隨意的操作屬性。如:
var o = {name:"David"}
console.log(o.name)
o.name = "James" // 修改name
console.log(o.name)
為了讓對象屬性擁有封裝性,不讓外部隨意改動屬性,我們可以通過提供函數(shù)來操作屬性。通過提供兩個函數(shù),一個提供讀取操作:getter,一個提供寫操作:setter。
getter&setter的語法與函數(shù)語法非常相似,把function關鍵字替換為 get或set就是getter&setter的語法了,如下:
get name(){
statements...
}
set name(value){ //注意setter的括號里有一個value參數(shù)
statements...
}
我們將上述例子用getter&setter來改寫一下:
function Student()
{
var _name = "David";
return {
get name(){
console.log("call getter");
return _name
}, // 定義getter
set name(value){
console.log("call setter");
_name = value
} // 定義setter
}
}
var o = Student()
console.log(o.name) //o.name會調(diào)用getter
o.name = "James" // o.name= 會調(diào)用setter
console.log(o.name)
上述代碼中定義了 get name() & set name(),當使用o.name時會調(diào)用get name()函數(shù),當使用o.name=value賦值時,會調(diào)用set name()函數(shù)。
讓我們來看一下運行結果:
call getter
David
call setter
call getter
James
有了getter&setter后,代碼就變得非常靈活。例如,將setter去除,就相當于定義了一個只讀變量。將上述代碼的setter去掉后,代碼如下:
function Student()
{
var _name = "David";
return {
get name(){
console.log("call getter");
return _name
},
}
}
var o = Student()
console.log(o.name)
o.name = "James" // 因為沒有setter,此行代碼相當于沒有
console.log(o.name)
上述代碼去掉了setter,我們來看一下運行結果:
call getter
David
call getter
David
可以看到,前后兩次輸出的都是David,因為沒有setter,我們對o.name="James"的賦值根本沒有成功。
OK,結束。
什么是Object.assign?什么是Object.defineProperty?