From 32b7bd2c881afa62a852753f4d9847d799e3c125 Mon Sep 17 00:00:00 2001 From: Owen <469564715@qq.com> Date: Fri, 20 May 2016 17:34:05 +0800 Subject: [PATCH] =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 阮老师你好,我在阅读您Proxy书稿第553行,“注意与Proxy对象的`has`方法区分,后者用来拦截`in`操作符,对`for...in`循环无效。" 时,认为有所不妥 因为根据我在新chrome浏览器上的测试 , 使用has 控制器是可以对for...in起作用的 我在介绍has 控制器的段落里添加了一个小例子来说明这个问题 可能我的理解并不到位出了差错,浪费了老师宝贵时间,望见谅 --- docs/proxy.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/docs/proxy.md b/docs/proxy.md index 31d03df..160358d 100644 --- a/docs/proxy.md +++ b/docs/proxy.md @@ -466,6 +466,42 @@ var p = new Proxy(obj, { 上面代码中,`obj`对象禁止扩展,结果使用`has`拦截就会报错。 +has 也可以用于拦截for...in操作 + +```javascript +let stu1 = { + name: "Owen", + score: 59 +} + +let stu2 = { + name: "Mark", + score: 99 +} + +let handler = { + has(target , prop) { + if(prop === "score" && target[prop] < 60) { + console.log(`${target["name"]}偷偷地把考砸的分数藏起来了`); + return false; + } + + return prop in target; + } +} + +let oproxy1 = new Proxy(stu1 , handler); +let oproxy2 = new Proxy(stu2 , handler); + +for(let a in oproxy1) { + console.log(oproxy1[a]); +} + +for(let b in oproxy2) { + console.log(oproxy2[b]); +} +``` + ### construct() `construct`方法用于拦截`new`命令。