Files
krkr2doc/docs/tjs2doc/contents/property.html
2016-09-08 17:50:19 +09:00

128 lines
10 KiB
HTML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<!-- generated by to_html.pl from property.xml -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>プロパティ</title>
<meta name="author" content="W.Dee" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<link href="browser.css" type="text/css" rel="stylesheet" title="吉里吉里関連リファレンス用標準スタイル" />
<link href="mailto:[email protected]" rev="Made" />
<link href="index.html" target="_top" rel="Start" title="トップページ" />
</head>
<body>
<h1><a id="id279" name="id279">プロパティ</a>
</h1><div class="para"><div>
 プロパティとは、変数と同じように扱うことができるが、実際はメソッド呼び出しと同様に、<a id="id280" name="id280" class="targanchor"><dfn>セッター</dfn></a> ( <a id="id281" name="id281" class="targanchor"><dfn>setter</dfn></a> ) と<a id="id282" name="id282" class="targanchor"><dfn>ゲッター</dfn></a> ( <a id="id283" name="id283" class="targanchor"><dfn>getter</dfn></a> ) の呼び出しを伴うものです。セッターやゲッターを、プロパティハンドラと呼ぶ場合があります。<br />
<br />
 構文は以下の通りです。<br />
<br />
<code class="bq"><a id="id284" name="id284" class="targanchor"><dfn>property</dfn></a>&nbsp;識別子<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;setter(引数)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;ここにセッターの内容</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;getter()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;ここにゲッターの内容</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;式;&nbsp;<span class="comment">//&nbsp;ゲッターとして返す値</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</code>
<br />
 setter と getter は、逆の順番で書かれていてもかまいません。 <br />
 この property を記述したクラスや、グローバルのメンバとしてこのプロパティは登録されますが、この識別子からの値の取得はゲッター、値の設定はセッターを通して行われます。これらのセッターとゲッターは、メソッド同様に様々な内容を書くことができます。セッターは setter に続く ( ) 内に、値を受け取る変数を引数として書きます。ゲッターは <a id="id285" name="id285" class="targanchor"><dfn>return</dfn></a> ステートメントにて値を返します。<br />
<br />
 getterのあとの () は省略できます。 <br />
<br />
 一つの識別子に対し、セッターとゲッターの両方を書けば、読み書きの両方が可能なプロパティになります。一方しか書かない場合、たとえばゲッターしか書かない場合は、読み出し専用のプロパティとなり、書き込みはエラーになります。<br />
<br />
<code class="bq"><span class="weak">例:</span><br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;value;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;property&nbsp;property1&nbsp;<span class="comment">//&nbsp;プロパティ&nbsp;'property1'&nbsp;を宣言</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setter(v)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;セッターはただ一つだけの引数をとる</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value=v;&nbsp;<span class="comment">//&nbsp;引数&nbsp;v&nbsp;を処理する</span><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inform(&quot;value&nbsp;set.&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getter<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;propset&nbsp;と同じ識別子&nbsp;'property1'&nbsp;のゲッターを宣言</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;ゲッターに引数はない</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inform(&quot;value&nbsp;get.&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;value;&nbsp;<span class="comment">//&nbsp;戻り値として返す</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;property1=5;&nbsp;<span class="comment">//&nbsp;property1&nbsp;への代入は、セッターが呼ばれる</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;property1++;&nbsp;<span class="comment">//&nbsp;このような式では、ゲッターが呼ばれ、</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;次にセッターが呼ばれて値が設定される</span><br />
}<br />
</code>
<br />
 プロパティも変数や関数やクラス同様、<a id="id286" name="id286" class="targanchor"><dfn>オーバーライド</dfn></a>できます。<br />
</div></div>
<h1><a id="id287" name="id287">プロパティオブジェクト</a>
</h1><div class="para"><div>
 プロパティ自身も一つのオブジェクトです。しかし、なんらかのオブジェクトに登録されている場合は、普通のアクセス方法ではプロパティハンドラが呼ばれるだけであり、プロパティオブジェクトそのものにはアクセスできません。<br />
 プロパティオブジェクトそのものを取り出すには <code class="inlinecode"><a id="id288" name="id288" class="targanchor"><dfn>&amp;</dfn></a></code> 演算子を使います。取り出したプロパティオブジェクトはローカル変数に入れることが出来ます。<br />
 また、<code class="inlinecode">&amp;</code> 演算子を使ってプロパティオブジェクトを登録することもできます。<br />
<br />
<code class="bq"><span class="weak">例:</span><br />&nbsp;&nbsp;&nbsp;&nbsp;property&nbsp;prop&nbsp;<span class="comment">//&nbsp;プロパティ&nbsp;prop&nbsp;を宣言</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(略)<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;p&nbsp;=&nbsp;&amp;prop;&nbsp;<span class="comment">//&nbsp;プロパティオブジェクトを得てローカル変数に入れる</span><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&amp;object.property1&nbsp;=&nbsp;p;&nbsp;<span class="comment">//&nbsp;p&nbsp;&nbsp;object&nbsp;&nbsp;property1&nbsp;として登録する</span><br />
}<br />
</code>
<br />
<br />
 <code class="inlinecode">&amp;</code> 演算子を使うと、ゲッターやセッターは呼ばれずにプロパティオブジェクトそのものにアクセスする事ができます。<code class="inlinecode">&amp;</code> 演算子を使わなければ通常のプロパティへのアクセスとなります。<br />
<br />
 ローカル変数として取り出したプロパティオブジェクトは、オブジェクトに登録しなくとも、<code class="inlinecode"><a id="id289" name="id289" class="targanchor"><dfn>*</dfn></a></code> 演算子を用いてプロパティハンドラを呼び出すことができます。<br />
<br />
<br />
<code class="bq"><span class="weak">例:</span><br />&nbsp;&nbsp;&nbsp;&nbsp;property&nbsp;prop&nbsp;<span class="comment">//&nbsp;プロパティ&nbsp;prop&nbsp;を宣言</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(略)<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;p&nbsp;=&nbsp;&amp;prop;&nbsp;<span class="comment">//&nbsp;プロパティオブジェクトを得てローカル変数に入れる</span><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;*p&nbsp;=&nbsp;30;&nbsp;<span class="comment">//&nbsp;setter&nbsp;を呼び出し&nbsp;30&nbsp;を設定する</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;func(*p);&nbsp;<span class="comment">//&nbsp;getter&nbsp;を呼び出し値を取得し、func&nbsp;に渡す</span><br />
}<br />
</code>
<br />
<br /><div class="note"><div class="notehead"><span class="noteheadspan">Note</span></div>
上記のように var 変数にプロパティオブジェクトをとる場合は、変数はローカル変数にしてください。これは、プロパティオブジェクトはいったんオブジェクトに登録されると、プロパティオブジェクトとしてではなくプロパティとしてゲッターやセッターを介した動作をするようになるためです。つまり、ローカル変数ではなく、グローバル変数(=globalのメンバ)やオブジェクトのメンバにプロパティオブジェクトを登録してしまうと、普通のプロパティと同じように振る舞うようになります。もちろんこのようにしてグローバル変数やオブジェクトのメンバに登録したプロパティオブジェクトを取り出すために &amp; 演算子を使うのはかまいません。</div><br />
<br />
プロパティオブジェクトに対して instanceof 演算子を &quot;Property&quot; を伴って使用した場合は真になります(上記の例で言うと、&amp;prop instanceof &quot;Property&quot; は真)。<br />
</div></div>
<script type="text/javascript" charset="UTF-8" src="documentid.js" ></script>
<script type="text/javascript" charset="UTF-8" src="postcontent.js" ></script>
</body>
</html>