From d814b273c83ffce5d9841e61da8a654488b71947 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Tue, 26 Aug 2014 12:41:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9Object/Proxy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/object.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/docs/object.md b/docs/object.md index 0b6b8e5..0ee089e 100644 --- a/docs/object.md +++ b/docs/object.md @@ -338,6 +338,38 @@ proxy.age // 抛出一个错误 上面代码表示,如果访问目标对象不存在的属性,会抛出一个错误。如果没有这个拦截函数,访问不存在的属性,只会返回undefined。 +除了取值函数get,Proxy还可以设置存值函数set,用来拦截某个属性的赋值行为。假定Person对象有一个age属性,该属性应该是一个不大于200的整数,那么可以使用Proxy对象保证age的属性值符合要求。 + +```javascript + +let validator = { + set: function(obj, prop, value) { + if (prop === 'age') { + if (!Number.isInteger(value)) { + throw new TypeError('The age is not an integer'); + } + if (value > 200) { + throw new RangeError('The age seems invalid'); + } + } + + // 对于age以外的属性,直接保存 + obj[prop] = value; + } +}; + +let person = new Proxy({}, validator); + +person.age = 100; + +person.age // 100 +person.age = 'young' // 报错 +person.age = 300 // 报错 + +``` + +上面代码中,由于设置了存值函数set,任何不符合要求的age属性赋值,都会抛出一个错误。 + ## Object.observe(),Object.unobserve() Object.observe方法用来监听对象的变化。一旦监听对象发生变化,就会触发回调函数。