mirror of
https://github.com/ruanyf/es6tutorial.git
synced 2025-05-25 11:12:21 +00:00
Merge pull request #196 from xcatliu/patch-9
Fix coding style in docs/proxy.md
This commit is contained in:
commit
6bbd9a2bee
@ -35,7 +35,7 @@ obj.count = 1
|
|||||||
ES6原生提供Proxy构造函数,用来生成Proxy实例。
|
ES6原生提供Proxy构造函数,用来生成Proxy实例。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
var proxy = new Proxy(target, handler)
|
var proxy = new Proxy(target, handler);
|
||||||
```
|
```
|
||||||
|
|
||||||
Proxy对象的所有用法,都是上面这种形式,不同的只是`handler`参数的写法。其中,`new Proxy()`表示生成一个Proxy实例,target参数表示所要拦截的目标对象,`handler`参数也是一个对象,用来定制拦截行为。
|
Proxy对象的所有用法,都是上面这种形式,不同的只是`handler`参数的写法。其中,`new Proxy()`表示生成一个Proxy实例,target参数表示所要拦截的目标对象,`handler`参数也是一个对象,用来定制拦截行为。
|
||||||
@ -73,7 +73,7 @@ target.a // "b"
|
|||||||
一个技巧是将Proxy对象,设置到`object.proxy`属性,从而可以在`object`对象上调用。
|
一个技巧是将Proxy对象,设置到`object.proxy`属性,从而可以在`object`对象上调用。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
var object = { proxy: new Proxy(target, handler) }
|
var object = { proxy: new Proxy(target, handler) };
|
||||||
```
|
```
|
||||||
|
|
||||||
Proxy实例也可以作为其他对象的原型对象。
|
Proxy实例也可以作为其他对象的原型对象。
|
||||||
@ -357,7 +357,7 @@ var handler = {
|
|||||||
invariant(key, 'set');
|
invariant(key, 'set');
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
function invariant (key, action) {
|
function invariant (key, action) {
|
||||||
if (key[0] === '_') {
|
if (key[0] === '_') {
|
||||||
throw new Error(`Invalid attempt to ${action} private "${key}" property`);
|
throw new Error(`Invalid attempt to ${action} private "${key}" property`);
|
||||||
@ -382,7 +382,7 @@ var handler = {
|
|||||||
apply (target, ctx, args) {
|
apply (target, ctx, args) {
|
||||||
return Reflect.apply(...arguments);
|
return Reflect.apply(...arguments);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
`apply`方法可以接受三个参数,分别是目标对象、目标对象的上下文对象(`this`)和目标对象的参数数组。
|
`apply`方法可以接受三个参数,分别是目标对象、目标对象的上下文对象(`this`)和目标对象的参数数组。
|
||||||
@ -461,7 +461,7 @@ var p = new Proxy(obj, {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
"a" in p; // TypeError is thrown
|
"a" in p // TypeError is thrown
|
||||||
```
|
```
|
||||||
|
|
||||||
上面代码中,`obj`对象禁止扩展,结果使用`has`拦截就会报错。
|
上面代码中,`obj`对象禁止扩展,结果使用`has`拦截就会报错。
|
||||||
@ -475,7 +475,7 @@ var handler = {
|
|||||||
construct (target, args) {
|
construct (target, args) {
|
||||||
return new target(...args);
|
return new target(...args);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
下面是一个例子。
|
下面是一个例子。
|
||||||
@ -515,15 +515,15 @@ var handler = {
|
|||||||
invariant(key, 'delete');
|
invariant(key, 'delete');
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
function invariant (key, action) {
|
function invariant (key, action) {
|
||||||
if (key[0] === '_') {
|
if (key[0] === '_') {
|
||||||
throw new Error(`Invalid attempt to ${action} private "${key}" property`);
|
throw new Error(`Invalid attempt to ${action} private "${key}" property`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var target = { _prop: 'foo' }
|
var target = { _prop: 'foo' };
|
||||||
var proxy = new Proxy(target, handler)
|
var proxy = new Proxy(target, handler);
|
||||||
delete proxy._prop
|
delete proxy._prop
|
||||||
// Error: Invalid attempt to delete private "_prop" property
|
// Error: Invalid attempt to delete private "_prop" property
|
||||||
```
|
```
|
||||||
@ -537,11 +537,11 @@ delete proxy._prop
|
|||||||
```javascript
|
```javascript
|
||||||
var handler = {
|
var handler = {
|
||||||
defineProperty (target, key, descriptor) {
|
defineProperty (target, key, descriptor) {
|
||||||
return false
|
return false;
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
var target = {}
|
var target = {};
|
||||||
var proxy = new Proxy(target, handler)
|
var proxy = new Proxy(target, handler);
|
||||||
proxy.foo = 'bar'
|
proxy.foo = 'bar'
|
||||||
// TypeError: proxy defineProperty handler returned false for property '"foo"'
|
// TypeError: proxy defineProperty handler returned false for property '"foo"'
|
||||||
```
|
```
|
||||||
@ -557,9 +557,9 @@ var handler = {
|
|||||||
enumerate (target) {
|
enumerate (target) {
|
||||||
return Object.keys(target).filter(key => key[0] !== '_')[Symbol.iterator]();
|
return Object.keys(target).filter(key => key[0] !== '_')[Symbol.iterator]();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
var target = { prop: 'foo', _bar: 'baz', _prop: 'foo' }
|
var target = { prop: 'foo', _bar: 'baz', _prop: 'foo' };
|
||||||
var proxy = new Proxy(target, handler)
|
var proxy = new Proxy(target, handler);
|
||||||
for (let key in proxy) {
|
for (let key in proxy) {
|
||||||
console.log(key);
|
console.log(key);
|
||||||
// "prop"
|
// "prop"
|
||||||
@ -607,11 +607,11 @@ for (var x in p) {} // 报错
|
|||||||
var handler = {
|
var handler = {
|
||||||
getOwnPropertyDescriptor (target, key) {
|
getOwnPropertyDescriptor (target, key) {
|
||||||
if (key[0] === '_') {
|
if (key[0] === '_') {
|
||||||
return
|
return;
|
||||||
}
|
|
||||||
return Object.getOwnPropertyDescriptor(target, key)
|
|
||||||
}
|
}
|
||||||
|
return Object.getOwnPropertyDescriptor(target, key);
|
||||||
}
|
}
|
||||||
|
};
|
||||||
var target = { _foo: 'bar', baz: 'tar' };
|
var target = { _foo: 'bar', baz: 'tar' };
|
||||||
var proxy = new Proxy(target, handler);
|
var proxy = new Proxy(target, handler);
|
||||||
Object.getOwnPropertyDescriptor(proxy, 'wat')
|
Object.getOwnPropertyDescriptor(proxy, 'wat')
|
||||||
@ -682,7 +682,7 @@ var p = new Proxy({}, {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Object.isExtensible(p); // 报错
|
Object.isExtensible(p) // 报错
|
||||||
```
|
```
|
||||||
|
|
||||||
### ownKeys()
|
### ownKeys()
|
||||||
@ -732,7 +732,7 @@ for (let key of Object.keys(proxy)) {
|
|||||||
|
|
||||||
`preventExtensions`方法拦截`Object.preventExtensions()`。该方法必须返回一个布尔值。
|
`preventExtensions`方法拦截`Object.preventExtensions()`。该方法必须返回一个布尔值。
|
||||||
|
|
||||||
这个方法有一个限制,只有当`Object.isExtensible(proxy)`为`false`(即不可扩展)时,`proxy.preventExtensions`才能返回true,否则会报错。
|
这个方法有一个限制,只有当`Object.isExtensible(proxy)`为`false`(即不可扩展)时,`proxy.preventExtensions`才能返回`true`,否则会报错。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
var p = new Proxy({}, {
|
var p = new Proxy({}, {
|
||||||
@ -741,7 +741,7 @@ var p = new Proxy({}, {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Object.preventExtensions(p); // 报错
|
Object.preventExtensions(p) // 报错
|
||||||
```
|
```
|
||||||
|
|
||||||
上面代码中,`proxy.preventExtensions`方法返回`true`,但这时`Object.isExtensible(proxy)`会返回`true`,因此报错。
|
上面代码中,`proxy.preventExtensions`方法返回`true`,但这时`Object.isExtensible(proxy)`会返回`true`,因此报错。
|
||||||
@ -773,7 +773,7 @@ var handler = {
|
|||||||
setPrototypeOf (target, proto) {
|
setPrototypeOf (target, proto) {
|
||||||
throw new Error('Changing the prototype is forbidden');
|
throw new Error('Changing the prototype is forbidden');
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
var proto = {};
|
var proto = {};
|
||||||
var target = function () {};
|
var target = function () {};
|
||||||
var proxy = new Proxy(target, handler);
|
var proxy = new Proxy(target, handler);
|
||||||
@ -915,7 +915,7 @@ Reflect.apply(Math.floor, undefined, [1.75]) // 1
|
|||||||
var obj = {
|
var obj = {
|
||||||
get foo() { return this.bar(); },
|
get foo() { return this.bar(); },
|
||||||
bar: function() { ... }
|
bar: function() { ... }
|
||||||
}
|
};
|
||||||
|
|
||||||
// 下面语句会让 this.bar()
|
// 下面语句会让 this.bar()
|
||||||
// 变成调用 wrapper.bar()
|
// 变成调用 wrapper.bar()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user