有兩種方式使用 setter 和 getter
1. set/get
var person = {
_name: '',
get name() { return this._name },
set name(n) { this._name = n }
}
// 測試
person.name // ''
person.name = 'john' // 'john', 此時 person._name 也變成了 'john'
2. Object.defineProperty
var person = {}
var name = ''
Object.defineProperty(person, 'name', {
configurable: true,
enumerable: true,
get: function() {
return name
},
set: function(n) {
name = n
}
})
// 測試
person.name // undefind
person.name = 'john' // 'john',此時全局的 name 也變成了 'john'
當然,通常用 setter 和 getter 來實現私有變量
// 私有變量
var person = function() {
var _name = ''
var _age = 0
return {
get name() { return _name },
set name(n) { _name = n },
get age() { return _age },
set age(a) { _age = a }
}
}()
或者
// 私有變量
var person = function() {
var _name = ''
var _age = 0
var obj = {}
Object.defineProperty(obj, 'name', {
configurable: true,
enumerable: true,
get: function() {
return _name
},
set: function(n) {
_name = n
}
})
Object.defineProperty(obj, 'age', {
configurable: true,
enumerable: true,
get: function() {
return _age
},
set: function(a) {
_age = a
}
})
return obj
}()
當然,setter 和 getter 最牛逼的用處是用來實現目前流行的 “雙向綁定”,MVxx之類的庫。不支持 setter 和 getter 的低版本瀏覽器則只能用輪詢的方式來搞了。
