有兩種方式使用 setter 和 getter 1. set/get 2. Object.defineProperty 當然,通常用 setter 和 getter 來實現私有變數 或者 當然,setter 和 getter 最牛逼的用處是用來實現目前流行的 “雙向綁定”,MVxx之類的庫。不支持
有兩種方式使用 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 的低版本瀏覽器則只能用輪詢的方式來搞了。