转载

ES5 的 setter 和 getter

有两种方式使用 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 的低版本浏览器则只能用轮询的方式来搞了。

 

正文到此结束
本文目录