mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-06-09 15:34:05 +08:00
150 lines
13 KiB
HTML
150 lines
13 KiB
HTML
<article id="wikiArticle">
|
||
<div></div>
|
||
<p>属性访问器提供了两种方式用于访问一个对象的属性,它们分别是点号和方括号。</p>
|
||
<div><iframe class="interactive interactive-js" frameborder="0" height="250" src="https://interactive-examples.mdn.mozilla.net/pages/js/expressions-propertyaccessors.html" width="100%"></iframe></div>
|
||
<p class="hidden">The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone <a class="external" href="https://github.com/mdn/interactive-examples" rel="noopener">https://github.com/mdn/interactive-examples</a> and send us a pull request.</p>
|
||
<h2 id="语法">语法</h2>
|
||
<pre><code class="language-javascript">object.property
|
||
object['property']
|
||
</code></pre>
|
||
<h2 id="描述">描述</h2>
|
||
<p class="syntaxbox">我们可以将对象看做是一个<em>关联数组(</em>或者:<em>映射</em>、<em>字典</em>、<em>哈希表</em>、<em>查询表</em>)。这个数组中的键就是这个对象中属性的名称。通常,当我们提及一个对象的属性时,会对属性与方法之间做个对比。然而,属性与方法之间的区别并不大。一个方法就是一个可以被调用的属性而已,例如一个指向函数 <a href="/zh-CN/docs/Glossary/Function">Function</a> 实例的引用可以作为对象属性的值。</p>
|
||
<p>访问对象属性有两种方式:点号表示法和方括号表示法。</p>
|
||
<h3 id="点号表示法">点号表示法</h3>
|
||
<pre><code class="language-javascript">get = object.property;
|
||
object.property = set;
|
||
</code></pre>
|
||
<p>以上代码中,<code>property</code>必须是一个有效的 JavaScript 标识符,例如,一串字母数字字符,也包括下划线及美元符号,但不能以数字作为开头。比如,<code>object.$1</code>是合法的,而 <code>object.1</code>是无效不合法的。</p>
|
||
<pre><code class="language-javascript">document.createElement('pre');
|
||
</code></pre>
|
||
<p>在上述代码块中,<code>document</code>中存在一个名为"createElement"的方法并且被调用了。</p>
|
||
<p>如果对数字字面量使用方法,并且数字文字没有指数且没有小数点,请在方法调用之前的点之前留出空格,以防止点被解释为小数点。</p>
|
||
<pre><code class="language-javascript">77 .toExponential();
|
||
// 或
|
||
77
|
||
.toExponential();
|
||
// 或
|
||
(77).toExponential();
|
||
// 或
|
||
77..toExponential();
|
||
// 或
|
||
77.0.toExponential();
|
||
// 因为 77. === 77.0,没有歧义(no ambiguity)
|
||
</code></pre>
|
||
<h3 id="方括号表示法">方括号表示法</h3>
|
||
<pre><code class="language-javascript">get = object[property_name];
|
||
object[property_name] = set;
|
||
</code></pre>
|
||
<p><code>property_name</code> 是一个字符串。该字符串不一定是一个合法的标识符;它可以是任意值,例如,"1foo","!bar!",甚至是 " "(一个空格)。</p>
|
||
<pre><code class="language-javascript">document['createElement']('pre');
|
||
</code></pre>
|
||
<p>这里的代码的功能跟上一个例子的作用是相同的。</p>
|
||
<p>括号之前允许有空格。</p>
|
||
<pre><code class="language-javascript">document ['createElement']('pre');
|
||
</code></pre>
|
||
<h3 id="属性名称">属性名称</h3>
|
||
<p>属性名称必须是字符串或符号 Symbol。这意味着非字符串对象不能用来作为一个对象属性的键。任何非字符串对象,包括 Number,都会通过 <a href="Reference/Global_Objects/Object/toString">toString</a> 方法,被转换成一个字符串。</p>
|
||
<pre><code class="language-javascript">var object = {};
|
||
object['1'] = 'value';
|
||
console.log(object[1]);
|
||
</code></pre>
|
||
<p>上述代码的输出为"value",因为 1 被类型转换为'1'。</p>
|
||
<pre><code class="language-javascript">var foo = {unique_prop: 1}, bar = {unique_prop: 2}, object = {};
|
||
object[foo] = 'value';
|
||
console.log(object[bar]);
|
||
</code></pre>
|
||
<p>上述的代码的输出也是 "value",由于对象 foo 和 bar 都会被转成相同的字符串。在<a href="/zh-CN/docs/Mozilla/Projects/SpiderMonkey">SpiderMonkey</a> JavaScript 引擎中,这个字符串是 "[object Object]"。</p>
|
||
<h3 id="方法绑定">方法绑定</h3>
|
||
<p>一个方法没有绑定到对象上,那就意味着这个方法是不起作用的。特别要注意的是,在一个方法中<code>this</code>对象并不是固定的,例如,<code>this</code>不需要指向包含当前方法的对象。<code>this</code>可通过函数调用被传递过去的值所替换。详见<a href="Reference/Operators/this#Method_binding">方法绑定</a>。</p>
|
||
<h3 id="注意eval">注意<code>eval</code></h3>
|
||
<p>在那些可通过方括号表示法替换的场景下,JavaScript 新手在使用<a href="Reference/Global_Objects/eval">eval</a> 经常会犯错。例如,下面的语法经常在很多代码中找到。</p>
|
||
<pre><code class="language-javascript">x = eval('document.forms.form_name.elements.' + strFormControl + '.value');
|
||
</code></pre>
|
||
<p><a class="external" href="https://www.nczonline.net/blog/2013/06/25/eval-isnt-evil-just-misunderstood/" rel="noopener"><code>eval</code></a> 的性能较差,且有安全风险。在任何时候都应该避免使用。而且,此时 <code>strFormControl</code> 必须是一个合法的标识符, 这在一些表单控件的 name、ID 值之中并不是必要的。所以,使用括号来代替会更好一些:</p>
|
||
<pre><code class="language-javascript">x = document.forms["form_name"].elements[strFormControl].value;
|
||
</code></pre>
|
||
<h2 id="规范">规范</h2>
|
||
<table class="standard-table">
|
||
<tbody>
|
||
<tr>
|
||
<th scope="col">规范</th>
|
||
<th scope="col">状态</th>
|
||
<th scope="col">备注</th>
|
||
</tr>
|
||
<tr>
|
||
<td><a class="external" href="https://tc39.github.io/ecma262/#sec-property-accessors" hreflang="en" lang="en" rel="noopener">ECMAScript Latest Draft (ECMA-262)<br/><small lang="zh-CN">Property Accessors</small></a></td>
|
||
<td><span class="spec-Draft">Draft</span></td>
|
||
<td> </td>
|
||
</tr>
|
||
<tr>
|
||
<td><a class="external" href="https://www.ecma-international.org/ecma-262/6.0/#sec-property-accessors" hreflang="en" lang="en" rel="noopener">ECMAScript 2015 (6th Edition, ECMA-262)<br/><small lang="zh-CN">Property Accessors</small></a></td>
|
||
<td><span class="spec-Standard">Standard</span></td>
|
||
<td> </td>
|
||
</tr>
|
||
<tr>
|
||
<td><a class="external" href="https://www.ecma-international.org/ecma-262/5.1/#sec-11.2.1" hreflang="en" lang="en" rel="noopener">ECMAScript 5.1 (ECMA-262)<br/><small lang="zh-CN">Property Accessors</small></a></td>
|
||
<td><span class="spec-Standard">Standard</span></td>
|
||
<td> </td>
|
||
</tr>
|
||
<tr>
|
||
<td><a class="external" href="https://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%201st%20edition,%20June%201997.pdf#sec-11.2.1" hreflang="en" lang="en" rel="noopener">ECMAScript 1st Edition (ECMA-262)<br/><small lang="zh-CN">Property Accessors</small></a></td>
|
||
<td><span class="spec-Standard">Standard</span></td>
|
||
<td>Initial definition. Implemented in JavaScript 1.0.</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<h2 id="浏览器兼容性">浏览器兼容性</h2>
|
||
<div class="hidden">The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out <a class="external" href="https://github.com/mdn/browser-compat-data" rel="noopener">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</div>
|
||
<p></p><div class="bc-data"><a class="bc-github-link external" href="https://github.com/mdn/browser-compat-data" rel="noopener">Update compatibility data on GitHub</a><table class="bc-table bc-table-js"><thead><tr class="bc-platforms"><td></td><th class="bc-platform-desktop" colspan="6"><span>Desktop</span></th><th class="bc-platform-mobile" colspan="7"><span>Mobile</span></th><th class="bc-platform-server" colspan="1"><span>Server</span></th></tr><tr class="bc-browsers"><td></td><th class="bc-browser-chrome"><span class="bc-head-txt-label bc-head-icon-chrome">Chrome</span></th><th class="bc-browser-edge"><span class="bc-head-txt-label bc-head-icon-edge">Edge</span></th><th class="bc-browser-firefox"><span class="bc-head-txt-label bc-head-icon-firefox">Firefox</span></th><th class="bc-browser-ie"><span class="bc-head-txt-label bc-head-icon-ie">Internet Explorer</span></th><th class="bc-browser-opera"><span class="bc-head-txt-label bc-head-icon-opera">Opera</span></th><th class="bc-browser-safari"><span class="bc-head-txt-label bc-head-icon-safari">Safari</span></th><th class="bc-browser-webview_android"><span class="bc-head-txt-label bc-head-icon-webview_android">Android webview</span></th><th class="bc-browser-chrome_android"><span class="bc-head-txt-label bc-head-icon-chrome_android">Chrome for Android</span></th><th class="bc-browser-edge_mobile"><span class="bc-head-txt-label bc-head-icon-edge_mobile">Edge Mobile</span></th><th class="bc-browser-firefox_android"><span class="bc-head-txt-label bc-head-icon-firefox_android">Firefox for Android</span></th><th class="bc-browser-opera_android"><span class="bc-head-txt-label bc-head-icon-opera_android">Opera for Android</span></th><th class="bc-browser-safari_ios"><span class="bc-head-txt-label bc-head-icon-safari_ios">Safari on iOS</span></th><th class="bc-browser-samsunginternet_android"><span class="bc-head-txt-label bc-head-icon-samsunginternet_android">Samsung Internet</span></th><th class="bc-browser-nodejs"><span class="bc-head-txt-label bc-head-icon-nodejs">Node.js</span></th></tr></thead><tbody><tr><th scope="row">Property accessors</th><td class="bc-supports-yes bc-browser-chrome"><span class="bc-browser-name">Chrome</span><abbr class="bc-level-yes only-icon" title="Full support">
|
||
<span>Full support</span>
|
||
</abbr>
|
||
Yes</td><td class="bc-supports-yes bc-browser-edge"><span class="bc-browser-name">Edge</span><abbr class="bc-level-yes only-icon" title="Full support">
|
||
<span>Full support</span>
|
||
</abbr>
|
||
Yes</td><td class="bc-supports-yes bc-browser-firefox"><span class="bc-browser-name">Firefox</span><abbr class="bc-level-yes only-icon" title="Full support">
|
||
<span>Full support</span>
|
||
</abbr>
|
||
1</td><td class="bc-supports-yes bc-browser-ie"><span class="bc-browser-name">IE</span><abbr class="bc-level-yes only-icon" title="Full support">
|
||
<span>Full support</span>
|
||
</abbr>
|
||
Yes</td><td class="bc-supports-yes bc-browser-opera"><span class="bc-browser-name">Opera</span><abbr class="bc-level-yes only-icon" title="Full support">
|
||
<span>Full support</span>
|
||
</abbr>
|
||
Yes</td><td class="bc-supports-yes bc-browser-safari"><span class="bc-browser-name">Safari</span><abbr class="bc-level-yes only-icon" title="Full support">
|
||
<span>Full support</span>
|
||
</abbr>
|
||
Yes</td><td class="bc-supports-yes bc-browser-webview_android"><span class="bc-browser-name">WebView Android</span><abbr class="bc-level-yes only-icon" title="Full support">
|
||
<span>Full support</span>
|
||
</abbr>
|
||
Yes</td><td class="bc-supports-yes bc-browser-chrome_android"><span class="bc-browser-name">Chrome Android</span><abbr class="bc-level-yes only-icon" title="Full support">
|
||
<span>Full support</span>
|
||
</abbr>
|
||
Yes</td><td class="bc-supports-yes bc-browser-edge_mobile"><span class="bc-browser-name">Edge Mobile</span><abbr class="bc-level-yes only-icon" title="Full support">
|
||
<span>Full support</span>
|
||
</abbr>
|
||
Yes</td><td class="bc-supports-yes bc-browser-firefox_android"><span class="bc-browser-name">Firefox Android</span><abbr class="bc-level-yes only-icon" title="Full support">
|
||
<span>Full support</span>
|
||
</abbr>
|
||
4</td><td class="bc-supports-yes bc-browser-opera_android"><span class="bc-browser-name">Opera Android</span><abbr class="bc-level-yes only-icon" title="Full support">
|
||
<span>Full support</span>
|
||
</abbr>
|
||
Yes</td><td class="bc-supports-yes bc-browser-safari_ios"><span class="bc-browser-name">Safari iOS</span><abbr class="bc-level-yes only-icon" title="Full support">
|
||
<span>Full support</span>
|
||
</abbr>
|
||
Yes</td><td class="bc-supports-yes bc-browser-samsunginternet_android"><span class="bc-browser-name">Samsung Internet Android</span><abbr class="bc-level-yes only-icon" title="Full support">
|
||
<span>Full support</span>
|
||
</abbr>
|
||
Yes</td><td class="bc-supports-yes bc-browser-nodejs"><span class="bc-browser-name">nodejs</span><abbr class="bc-level-yes only-icon" title="Full support">
|
||
<span>Full support</span>
|
||
</abbr>
|
||
Yes</td></tr></tbody></table><section class="bc-legend" id="sect1"><h3 class="offscreen" id="Legend">Legend</h3><dl><dt><span class="bc-supports-yes bc-supports">
|
||
<abbr class="bc-level bc-level-yes only-icon" title="Full support">
|
||
<span>Full support</span>
|
||
|
||
</abbr></span></dt><dd>Full support</dd></dl></section></div><p></p>
|
||
<h2 id="参见">参见</h2>
|
||
<ul>
|
||
<li><a href="Reference/Global_Objects/Object" title="Object 构造函数创建一个对象包装器。"><code>Object</code></a></li>
|
||
<li><a href="Reference/Global_Objects/Object/defineProperty" title="Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。"><code>Object/defineProperty</code></a></li>
|
||
</ul>
|
||
</article> |