mirror of
https://github.com/ruanyf/es6tutorial.git
synced 2025-05-24 18:32:22 +00:00
docs(proxy): construct方法
This commit is contained in:
parent
f7494bc67e
commit
18b2f80f83
@ -65,7 +65,7 @@ ES5可以通过下面的代码,部署`Number.isFinite`方法。
|
|||||||
})(this);
|
})(this);
|
||||||
```
|
```
|
||||||
|
|
||||||
`Number.isNaN()`用来检查一个值是否为NaN。
|
`Number.isNaN()`用来检查一个值是否为`NaN`。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
Number.isNaN(NaN) // true
|
Number.isNaN(NaN) // true
|
||||||
@ -236,6 +236,8 @@ Number.MIN_SAFE_INTEGER === -9007199254740991
|
|||||||
// true
|
// true
|
||||||
```
|
```
|
||||||
|
|
||||||
|
上面代码中,可以看到JavaScript能够精确表示的极限。
|
||||||
|
|
||||||
`Number.isSafeInteger()`则是用来判断一个整数是否落在这个范围之内。
|
`Number.isSafeInteger()`则是用来判断一个整数是否落在这个范围之内。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
@ -256,7 +258,18 @@ Number.isSafeInteger(Number.MAX_SAFE_INTEGER) // true
|
|||||||
Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 1) // false
|
Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 1) // false
|
||||||
```
|
```
|
||||||
|
|
||||||
注意,验证运算结果是否落在安全整数的范围时,不要只验证运算结果,而要同时验证参与运算的每个值。
|
这个函数的实现很简单,就是跟安全整数的两个边界值比较一下。
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
Number.isSafeInteger = function (n) {
|
||||||
|
return (typeof n === 'number' &&
|
||||||
|
Math.round(n) === n &&
|
||||||
|
Number.MIN_SAFE_INTEGER <= n &&
|
||||||
|
n <= Number.MAX_SAFE_INTEGER);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
实际使用这个函数时,需要注意。验证运算结果是否落在安全整数的范围内,不要只验证运算结果,而要同时验证参与运算的每个值。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
Number.isSafeInteger(9007199254740993)
|
Number.isSafeInteger(9007199254740993)
|
||||||
|
@ -96,21 +96,29 @@ obj.time // 35
|
|||||||
```javascript
|
```javascript
|
||||||
var handler = {
|
var handler = {
|
||||||
get: function(target, name) {
|
get: function(target, name) {
|
||||||
if (name === 'prototype') return Object.prototype;
|
if (name === 'prototype') {
|
||||||
|
return Object.prototype;
|
||||||
|
}
|
||||||
return 'Hello, ' + name;
|
return 'Hello, ' + name;
|
||||||
},
|
},
|
||||||
apply: function(target, thisBinding, args) { return args[0]; },
|
|
||||||
construct: function(target, args) { return args[1]; }
|
apply: function(target, thisBinding, args) {
|
||||||
|
return args[0];
|
||||||
|
},
|
||||||
|
|
||||||
|
construct: function(target, args) {
|
||||||
|
return {value: args[1]};
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var fproxy = new Proxy(function(x, y) {
|
var fproxy = new Proxy(function(x, y) {
|
||||||
return x + y;
|
return x + y;
|
||||||
}, handler);
|
}, handler);
|
||||||
|
|
||||||
fproxy(1,2); // 1
|
fproxy(1, 2) // 1
|
||||||
new fproxy(1,2); // 2
|
new fproxy(1,2) // {value: 2}
|
||||||
fproxy.prototype; // Object.prototype
|
fproxy.prototype === Object.prototype // true
|
||||||
fproxy.foo; // 'Hello, foo'
|
fproxy.foo // "Hello, foo"
|
||||||
```
|
```
|
||||||
|
|
||||||
下面是Proxy支持的拦截操作一览。
|
下面是Proxy支持的拦截操作一览。
|
||||||
@ -167,7 +175,7 @@ fproxy.foo; // 'Hello, foo'
|
|||||||
|
|
||||||
拦截Proxy实例作为函数调用的操作,比如`proxy(...args)`、`proxy.call(object, ...args)`、`proxy.apply(...)`。
|
拦截Proxy实例作为函数调用的操作,比如`proxy(...args)`、`proxy.call(object, ...args)`、`proxy.apply(...)`。
|
||||||
|
|
||||||
**(13)construct(target, args, proxy)**
|
**(13)construct(target, args)**
|
||||||
|
|
||||||
拦截Proxy实例作为构造函数调用的操作,比如`new proxy(...args)`。
|
拦截Proxy实例作为构造函数调用的操作,比如`new proxy(...args)`。
|
||||||
|
|
||||||
@ -500,16 +508,21 @@ for (let b in oproxy2) {
|
|||||||
|
|
||||||
### construct()
|
### construct()
|
||||||
|
|
||||||
`construct`方法用于拦截`new`命令。
|
`construct`方法用于拦截`new`命令,下面是拦截对象的写法。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
var handler = {
|
var handler = {
|
||||||
construct (target, args) {
|
construct (target, args, newTarget) {
|
||||||
return new target(...args);
|
return new target(...args);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
`construct`方法可以接受两个参数。
|
||||||
|
|
||||||
|
- `target`: 目标对象
|
||||||
|
- `args`:构建函数的参数对象
|
||||||
|
|
||||||
下面是一个例子。
|
下面是一个例子。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
@ -525,7 +538,7 @@ new p(1).value
|
|||||||
// 10
|
// 10
|
||||||
```
|
```
|
||||||
|
|
||||||
如果`construct`方法返回的不是对象,就会抛出错误。
|
如果`construct`方法返回的必须是一个对象,否则会报错。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
var p = new Proxy(function() {}, {
|
var p = new Proxy(function() {}, {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user