mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-12-15 07:06:53 +08:00
语法高亮,滚动条美化,设置页面调整
This commit is contained in:
@@ -5,7 +5,7 @@
|
||||
<p class="summary">从ECMAScript 2015 开始,JavaScript 获得对<a href="Reference/Global_Objects/Proxy" title="Proxy 对象用于定义基本操作的自定义行为(如属性查找,赋值,枚举,函数调用等)。"><code>Proxy</code></a>和 <a href="Reference/Global_Objects/Reflect" title="Reflect 是一个内置的对象,它提供拦截 JavaScript 操作的方法。这些方法与处理器对象的方法相同。Reflect不是一个函数对象,因此它是不可构造的。"><code>Reflect</code></a>对象的支持,允许你拦截并定义基本语言操作的自定义行为(例如,属性查找,赋值,枚举,函数调用等)。借助这两个对象,你可以在 JavaScript 元级别进行编程。</p>
|
||||
<h2 id="代理">代理</h2>
|
||||
<p>在ECMAScript 6中引入<a href="Reference/Global_Objects/Proxy" title="Proxy 对象用于定义基本操作的自定义行为(如属性查找,赋值,枚举,函数调用等)。"><code>Proxy</code></a>对象可以拦截某些操作并实现自定义行为。 例如获取一个对象上的属性:</p>
|
||||
<pre class="brush: js">let handler = {
|
||||
<pre><code class="language-javascript">let handler = {
|
||||
get: function(target, name){
|
||||
return name in target ? target[name] : 42;
|
||||
}};
|
||||
@@ -14,7 +14,7 @@ let p = new Proxy({}, handler);
|
||||
p.a = 1;
|
||||
|
||||
console.log(p.a, p.b); // 1, 42
|
||||
</pre>
|
||||
</code></pre>
|
||||
<p><code>Proxy</code>对象定义了一个目标(这里是一个空对象)和一个实现了<code>get</code>陷阱的 handle 对象。这里,代理的对象在获取未定义的属性时不会返回<code>undefined</code>,而是返回 42。</p>
|
||||
<p>更多例子参见<a href="Reference/Global_Objects/Proxy" title="Proxy 对象用于定义基本操作的自定义行为(如属性查找,赋值,枚举,函数调用等)。"><code>Proxy</code></a>页面 。</p>
|
||||
<h3 id="术语">术语</h3>
|
||||
@@ -182,7 +182,7 @@ console.log(p.a, p.b); // 1, 42
|
||||
</table>
|
||||
<h2 id="撤销_Proxy">撤销 <code>Proxy</code></h2>
|
||||
<p><a href="Reference/Global_Objects/Proxy/revocable" title="Proxy.revocable() 方法可以用来创建一个可撤销的代理对象。"><code>Proxy.revocable()</code></a>方法被用来创建可撤销的<code>Proxy</code>对象。这意味着代理可以通过<code>revoke</code>函数来撤销并且关闭代理。此后,代理上的任意的操作都会导致<a href="Reference/Global_Objects/TypeError" title="TypeError(类型错误) 对象用来表示值的类型非预期类型时发生的错误。"><code>TypeError</code></a>。</p>
|
||||
<pre class="brush: js">var revocable = Proxy.revocable({}, {
|
||||
<pre><code class="language-javascript">var revocable = Proxy.revocable({}, {
|
||||
get: function(target, name) {
|
||||
return "[[" + name + "]]";
|
||||
}
|
||||
@@ -195,18 +195,18 @@ revocable.revoke();
|
||||
console.log(proxy.foo); // TypeError is thrown
|
||||
proxy.foo = 1 // TypeError again
|
||||
delete proxy.foo; // still TypeError
|
||||
typeof proxy // "object", typeof doesn't trigger any trap</pre>
|
||||
typeof proxy // "object", typeof doesn't trigger any trap</code></pre>
|
||||
<h2 id="反射">反射</h2>
|
||||
<p><a href="Reference/Global_Objects/Reflect" title="Reflect 是一个内置的对象,它提供拦截 JavaScript 操作的方法。这些方法与处理器对象的方法相同。Reflect不是一个函数对象,因此它是不可构造的。"><code>Reflect</code></a> 是一个内置对象,它提供了可拦截JavaScript操作的方法。该方法和<a href="Reference/Global_Objects/Proxy/handler" title="处理器对象用来自定义代理对象的各种可代理操作。">代理句柄</a>类似,但<code>Reflect</code>方法并不是一个函数对象。</p>
|
||||
<p><code>Reflect</code>有助于将默认操作从处理程序转发到目标。</p>
|
||||
<p>以<a href="Reference/Global_Objects/Reflect/has" title="静态方法 Reflect.has() 作用与 in 操作符 相同。"><code>Reflect.has()</code></a>为例,你可以将<a href="/en-US/docs/Web/JavaScript/Reference/Operators/in"><code>in</code>运算符</a>作为函数:</p>
|
||||
<pre class="brush: js">Reflect.has(Object, "assign"); // true
|
||||
</pre>
|
||||
<pre><code class="language-javascript">Reflect.has(Object, "assign"); // true
|
||||
</code></pre>
|
||||
<h3 id="更好的apply_函数">更好的<code>apply</code> 函数</h3>
|
||||
<p>在ES5中,你通常使用 <a href="Reference/Global_Objects/Function/apply" title="apply() 方法调用一个具有给定this值的函数,以及作为一个数组(或类似数组对象)提供的参数。"><code>Function.prototype.apply()</code></a> 方法调用一个具有给定<code>this</code>值和<code>arguments</code>数组(或<a href="https://developer.mozilla.orgGuide/Indexed_collections#Working_with_array-like_objects">类数组对象</a>) 的函数。</p>
|
||||
<pre class="brush: js">Function.prototype.apply.call(Math.floor, undefined, [1.75]);</pre>
|
||||
<pre><code class="language-javascript">Function.prototype.apply.call(Math.floor, undefined, [1.75]);</code></pre>
|
||||
<p>使用<a href="Reference/Global_Objects/Reflect/apply" title="静态方法 Reflect.apply() 通过指定的参数列表发起对目标(target)函数的调用。"><code>Reflect.apply</code></a>,这变得不那么冗长和容易理解:</p>
|
||||
<pre class="brush: js">Reflect.apply(Math.floor, undefined, [1.75]);
|
||||
<pre><code class="language-javascript">Reflect.apply(Math.floor, undefined, [1.75]);
|
||||
// 1;
|
||||
|
||||
Reflect.apply(String.fromCharCode, undefined, [104, 101, 108, 108, 111]);
|
||||
@@ -216,15 +216,15 @@ Reflect.apply(RegExp.prototype.exec, /ab/, ['confabulation']).index;
|
||||
// 4
|
||||
|
||||
Reflect.apply(''.charAt, 'ponies', [3]);
|
||||
// "i"</pre>
|
||||
// "i"</code></pre>
|
||||
<h3 id="检查属性定义是否成功">检查属性定义是否成功</h3>
|
||||
<p>使用<a href="Reference/Global_Objects/Object/defineProperty" title="Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。"><code>Object.defineProperty</code></a>,如果成功返回一个对象,否则抛出一个 <a href="Reference/Global_Objects/TypeError" title="TypeError(类型错误) 对象用来表示值的类型非预期类型时发生的错误。"><code>TypeError</code></a>,你将使用 <a href="Reference/Statements/try...catch" title="try...catch语句将能引发错误的代码放在try块中,并且对应一个响应,然后有异常被抛出。"><code>try...catch</code></a> 块来捕获定义属性时发生的任何错误。因为<a href="Reference/Global_Objects/Reflect/defineProperty" title="静态方法 Reflect.defineProperty() 基本等同于 Object.defineProperty() 方法,唯一不同是返回 Boolean 值。"><code>Reflect.defineProperty</code></a>返回一个布尔值表示的成功状态,你可以在这里使用<a href="Reference/Statements/if...else" title="当指定条件为真,if 语句会执行一段语句。如果条件为假,则执行另一段语句。"><code>if...else</code></a> 块:</p>
|
||||
<pre class="brush: js">if (Reflect.defineProperty(target, property, attributes)) {
|
||||
<pre><code class="language-javascript">if (Reflect.defineProperty(target, property, attributes)) {
|
||||
// success
|
||||
} else {
|
||||
// failure
|
||||
}
|
||||
</pre>
|
||||
</code></pre>
|
||||
<p></p><div class="prevnext" style="text-align: right;">
|
||||
<p><a href="Guide/Iterators_and_Generators" style="float: left;">« 上一页</a><br/></p>
|
||||
</div><p></p>
|
||||
|
||||
Reference in New Issue
Block a user