1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-24 18:32:22 +00:00

docs(proxy): edit proxy.has()

This commit is contained in:
ruanyf 2016-09-21 19:47:59 +08:00
parent 102bf25570
commit 6c8bd07b8e

View File

@ -474,11 +474,13 @@ var p = new Proxy(obj, {
上面代码中,`obj`对象禁止扩展,结果使用`has`拦截就会报错。 上面代码中,`obj`对象禁止扩展,结果使用`has`拦截就会报错。
值得注意的是,`has`方法拦截的是`HasProperty`操作,而不是`HasOwnProperty`操作,即`has`方法不判断一个属性是对象自身的属性,还是继承的属性。由于`for...in`操作内部也会用到`HasProperty`操作,所以`has`方法在`for...in`循环时也会生效。 值得注意的是,`has`方法拦截的是`HasProperty`操作,而不是`HasOwnProperty`操作,即`has`方法不判断一个属性是对象自身的属性,还是继承的属性。
另外,虽然`for...in`循环也用到了`in`运算符,但是`has`拦截对`for...in`循环不生效。
```javascript ```javascript
let stu1 = {name: 'Owen', score: 59}; let stu1 = {name: '张三', score: 59};
let stu2 = {name: 'Mark', score: 99}; let stu2 = {name: '李四', score: 99};
let handler = { let handler = {
has(target, prop) { has(target, prop) {
@ -493,20 +495,27 @@ let handler = {
let oproxy1 = new Proxy(stu1, handler); let oproxy1 = new Proxy(stu1, handler);
let oproxy2 = new Proxy(stu2, handler); let oproxy2 = new Proxy(stu2, handler);
'score' in oproxy1
// 张三 不及格
// false
'score' in oproxy2
// true
for (let a in oproxy1) { for (let a in oproxy1) {
console.log(oproxy1[a]); console.log(oproxy1[a]);
} }
// Owen // 张三
// Owen 不及格 // 59
for (let b in oproxy2) { for (let b in oproxy2) {
console.log(oproxy2[b]); console.log(oproxy2[b]);
} }
// Mark // 李四
// Mark 99 // 99
``` ```
上面代码中,`for...in`循环时,`has`拦截会生效,导致不符合要求的属性被排除在`for...in`循环之外。 上面代码中,`has`拦截只对`in`循环生效,对`for...in`循环不生效,导致不符合要求的属性没有被排除在`for...in`循环之外。
### construct() ### construct()