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

Merge pull request #772 from new9xgh/hotfix/update-proxy

update proxy
This commit is contained in:
Ruan YiFeng 2018-11-21 17:47:50 +08:00 committed by GitHub
commit 4e13461d83
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -642,6 +642,7 @@ var p = new Proxy(function() {}, {
});
new p() // 报错
// Uncaught TypeError: 'construct' on proxy: trap returned non-object ('1')
```
### deleteProperty()
@ -689,7 +690,7 @@ proxy.foo = 'bar' // 不会生效
上面代码中,`defineProperty`方法返回`false`,导致添加新属性总是无效。
注意如果目标对象不可扩展extensible`defineProperty`不能增加目标对象上不存在的属性否则会报错。另外如果目标对象的某个属性不可写writable或不可配置configurable`defineProperty`方法不得改变这两个设置。
注意,如果目标对象不可扩展(non-extensible`defineProperty`不能增加目标对象上不存在的属性否则会报错。另外如果目标对象的某个属性不可写writable或不可配置configurable`defineProperty`方法不得改变这两个设置。
### getOwnPropertyDescriptor()
@ -740,7 +741,7 @@ Object.getPrototypeOf(p) === proto // true
上面代码中,`getPrototypeOf`方法拦截`Object.getPrototypeOf()`,返回`proto`对象。
注意,`getPrototypeOf`方法的返回值必须是对象或者`null`否则报错。另外如果目标对象不可扩展extensible `getPrototypeOf`方法必须返回目标对象的原型对象。
注意,`getPrototypeOf`方法的返回值必须是对象或者`null`,否则报错。另外,如果目标对象不可扩展(non-extensible `getPrototypeOf`方法必须返回目标对象的原型对象。
### isExtensible()
@ -778,7 +779,8 @@ var p = new Proxy({}, {
}
});
Object.isExtensible(p) // 报错
Object.isExtensible(p)
// Uncaught TypeError: 'isExtensible' on proxy: trap result does not reflect extensibility of proxy target (which is 'true')
```
### ownKeys()
@ -939,7 +941,7 @@ Object.getOwnPropertyNames(p)
上面代码中,`obj`对象的`a`属性是不可配置的,这时`ownKeys`方法返回的数组之中,必须包含`a`,否则会报错。
另外如果目标对象是不可扩展的non-extensition),这时`ownKeys`方法返回的数组之中,必须包含原对象的所有属性,且不能包含多余的属性,否则报错。
另外如果目标对象是不可扩展的non-extensible),这时`ownKeys`方法返回的数组之中,必须包含原对象的所有属性,且不能包含多余的属性,否则报错。
```javascript
var obj = {
@ -967,13 +969,14 @@ Object.getOwnPropertyNames(p)
这个方法有一个限制,只有目标对象不可扩展时(即`Object.isExtensible(proxy)``false``proxy.preventExtensions`才能返回`true`,否则会报错。
```javascript
var p = new Proxy({}, {
var proxy = new Proxy({}, {
preventExtensions: function(target) {
return true;
}
});
Object.preventExtensions(p) // 报错
Object.preventExtensions(proxy)
// Uncaught TypeError: 'preventExtensions' on proxy: trap returned truish but the proxy target is extensible
```
上面代码中,`proxy.preventExtensions`方法返回`true`,但这时`Object.isExtensible(proxy)`会返回`true`,因此报错。
@ -981,7 +984,7 @@ Object.preventExtensions(p) // 报错
为了防止出现这个问题,通常要在`proxy.preventExtensions`方法里面,调用一次`Object.preventExtensions`
```javascript
var p = new Proxy({}, {
var proxy = new Proxy({}, {
preventExtensions: function(target) {
console.log('called');
Object.preventExtensions(target);
@ -989,9 +992,9 @@ var p = new Proxy({}, {
}
});
Object.preventExtensions(p)
Object.preventExtensions(proxy)
// "called"
// true
// Proxy {}
```
### setPrototypeOf()
@ -1015,7 +1018,7 @@ Object.setPrototypeOf(proxy, proto);
上面代码中,只要修改`target`的原型对象,就会报错。
注意该方法只能返回布尔值否则会被自动转为布尔值。另外如果目标对象不可扩展extensible`setPrototypeOf`方法不得改变目标对象的原型。
注意,该方法只能返回布尔值,否则会被自动转为布尔值。另外,如果目标对象不可扩展(non-extensible`setPrototypeOf`方法不得改变目标对象的原型。
## Proxy.revocable()