mozilla

Revision 181016 of Binding Implementations

  • リビジョンの URL スラグ: XBL/XBL_1.0_Reference/Binding_Implementations
  • リビジョンのタイトル: Binding Implementations
  • リビジョンの ID: 181016
  • 作成日:
  • 作成者: kohei.yoshino
  • 現行リビジョン いいえ
  • コメント Migration

このリビジョンの内容

はじめに

バインディングは implementation タグを使ってバウンド要素上にメソッドとプロパティを定義することができます。バインディングによる実装はバウンド要素から直接呼び出すことができるメソッドとプロパティの新しいセットを提供します。

バインディング実装のメソッドとプロパティは XML の method タグや property タグを使って宣言形式で定義できます。外部実装 (例:バイナリの実装) が src 属性を使って定義することもできます。 src 属性が定義されると、implementation 要素のどの子供も無視されます。

メソッド

メソッドは method 要素を使って定義されます。 name 属性を使って与えられるその名前は要素上のメソッドを呼び出すのに使われる名前です。引数をともなう method は、その引数と名前を method 要素配下で宣言される parameter 要素で定義します。

メソッドの実装は、body 要素の内部に含まれます。定義された引数はメソッド本体の中の名前に結び付けられます。

<method name="scrollToIndex">
  <parameter name="index"/>
  <body>
    <![CDATA[
      if (index < 0)
        return;
      ...
    ]]>
  </body>
</method>

プロパティ

プロパティもまた、property タグを使ってバウンド要素上に定義できます。プロパティの基本的なタイプが二種類あります。プロパティの最初のタイプは要素自信の上で直接セットされる生の値です。プロパティの次のタイプはプロパティが取り出されるかセットされるときに呼び出される関数を定義するものです。これらの関数は XBL 上で「getter」と「setter」と呼ばれます。

生の値のプロパティのために、property タグの子供として初期値を定義できます。スクリプトはバインディングが結びつけられたときに評価され、結果の値が要素上に蓄えられます。bindingattached イベントがまだ発生していないけれども、バインディングの無名コンテントは全面的に構築されたと仮定することができます。bindingattached ハンドラがすべてのプロパティはバインディング上でアクセス可能であると仮定できる必要があるため、プロパティの初期化はいつもコンテント生成の後だけれどもバインディング結びつきのイベントの発生の前に生じます。

getter や setter をもつプロパティは onget 属性と onset 属性を使うか、より多弁な getter 要素と setter 要素を使って定義できます。もし、属性という手段と要素という手段の両方が getter や setter の定義に使われた場合、要素の手段のものは無視されます。

getter は、プロパティが呼び出されたときにその戻り値が返されるスクリプトを含みます。setter は、プロパティに新しい値がセットされたとき呼び出されるスクリプトを含みます。スクリプトの中では、val という単語は新しい値を表すために使われます。setter は、代入の連鎖 (例:a = this.b = c;) が成功するのを許すために実行結果として val を返します。

プロパティは readonly 属性を使って定数として指定することもできます。この属性を true にセットすると、プロパティの値は変更不能となります。プロパティが readonly (読み取り専用) であってsetter が定義されていたら、setter は無視されます。

プロパティは無名コンテント要素へ呼び出しや代入を転送する getter や setter を定義するための短縮文法もサポートしています。element 属性は、プロパティを得るかプロパティをセットするときに使われるべきバウンド要素の下の無名コンテントのIDを定義します。

無名コンテント要素上で、プロパティは要素上の属性か要素上のプロパティのどちらかから呼び出すことができます。property 属性の値は無名コンテント要素上で使うプロパティの名前を定義します。attribute 属性は無名コンテント要素上で使う属性の名前を定義します。もしこれらの属性のいずれかが property 要素上で定義されていたら、定義されたどの getter も setter も無視されます。生の初期値もまた無視されます。property と attribute の両方が定義されると、プロパティは優先され、属性は無視されます。

実装の継承

継承のつながりの二つのバインディング両方に実装があるとき、派生したバインディングの実装は基底となるバインディングの実装から継承されます。メソッドとプロパティの照合は動的です。曖昧さをなくすことなしに、二つのバインディングが同じメソッドかプロパティを定義するなら、もっとも派生したバインディングのメソッドかプロパティが使われます。

バインディングが DOM 要素を拡張するため、バインディングは DOM 要素上に本来備えているどのメソッドとプロパティをもオーバーライド (上書き) することができます。たとえば、バインディングは Element 上の setAttribute メソッドや、HTMLInputElement のための value プロパティの回収のオーバーライド (上書き) をすることもできるでしょう。

以下は現在のところ Mozilla には実装されていないようです。

実装は、implementation 要素上で定義された name 属性を使って名付けることもできます。実装が名前 (name) を持つとき、その名前は望みのメソッドやプロパティの曖昧さをなくすのに使うこともできます。

{{mediawiki.external('編集者メモ: 以下の段落で、基底クラスのメソッドやプロパティへのアクセスを JavaScriptでどうアクセス可能にするかについての文法を提案しています。これは開かれた課題です。私たちは言語に独立した概念の定義や、基底バインディングのメソッドとプロパティへアクセスを可能とするものの定義を試みる必要があるでしょうか?')}}

たとえば、ColorPicker 実装から派生した ColorPickerGrid があり、その両方で setColor メソッドが定義されているバインディングがあると、以下のような文法で ColorPicker のメソッドを呼び出すことができます。

... // myElement は ColorPickerGrid です
myElement.ColorPicker.setColor(); // ColorPicker メソッドを呼び出します
myElement.setColor(); // ColorPickerGrid メソッドを呼び出します
...

明確に基底クラスの名称を記述する方法が可能なのに加えて、baseBinding という名前を基底クラスが何かを知る必要がなく基底バインディング上のメソッドやプロパティを特定するために使うことができます。これは、例えば addBinding を使ったときなど、バインディングが暗黙に継承されたときに必要が生じます。

myElement.baseBinding.setColor(); // ColorPicker メソッドを呼び出します
{{ wiki.languages( { "en": "en/XBL/XBL_1.0_Reference/Binding_Implementations" } ) }}

このリビジョンのソースコード

<p>
</p>
<h2 name=".E3.81.AF.E3.81.98.E3.82.81.E3.81.AB"> はじめに </h2>
<p>バインディングは <code>implementation</code> タグを使ってバウンド要素上にメソッドとプロパティを定義することができます。バインディングによる実装はバウンド要素から直接呼び出すことができるメソッドとプロパティの新しいセットを提供します。
</p><p>バインディング実装のメソッドとプロパティは XML の <code>method</code> タグや <code>property</code> タグを使って宣言形式で定義できます。外部実装 (例:バイナリの実装) が <code>src</code> 属性を使って定義することもできます。 src 属性が定義されると、<code>implementation</code> 要素のどの子供も無視されます。 
</p>
<h2 name=".E3.83.A1.E3.82.BD.E3.83.83.E3.83.89"> メソッド </h2>
<p>メソッドは <code>method</code> 要素を使って定義されます。 <code>name</code> 属性を使って与えられるその名前は要素上のメソッドを呼び出すのに使われる名前です。引数をともなう <code>method</code> は、その引数と名前を <code>method</code> 要素配下で宣言される <code>parameter</code> 要素で定義します。
</p><p>メソッドの実装は、<code>body</code> 要素の内部に含まれます。定義された引数はメソッド本体の中の名前に結び付けられます。 
</p>
<pre>&lt;method name="scrollToIndex"&gt;
  &lt;parameter name="index"/&gt;
  &lt;body&gt;
    &lt;![CDATA[
      if (index &lt; 0)
        return;
      ...
    ]]&gt;
  &lt;/body&gt;
&lt;/method&gt;
</pre>
<h2 name=".E3.83.97.E3.83.AD.E3.83.91.E3.83.86.E3.82.A3"> プロパティ </h2>
<p>プロパティもまた、<code>property</code> タグを使ってバウンド要素上に定義できます。プロパティの基本的なタイプが二種類あります。プロパティの最初のタイプは要素自信の上で直接セットされる生の値です。プロパティの次のタイプはプロパティが取り出されるかセットされるときに呼び出される関数を定義するものです。これらの関数は XBL 上で「getter」と「setter」と呼ばれます。
</p><p>生の値のプロパティのために、<code>property</code> タグの子供として初期値を定義できます。スクリプトはバインディングが結びつけられたときに評価され、結果の値が要素上に蓄えられます。<code>bindingattached</code> イベントがまだ発生していないけれども、バインディングの無名コンテントは全面的に構築されたと仮定することができます。<code>bindingattached</code> ハンドラがすべてのプロパティはバインディング上でアクセス可能であると仮定できる必要があるため、プロパティの初期化はいつもコンテント生成の後だけれどもバインディング結びつきのイベントの発生の前に生じます。
</p><p>getter や setter をもつプロパティは <code>onget</code> 属性と <code>onset</code> 属性を使うか、より多弁な <code>getter</code> 要素と <code>setter</code> 要素を使って定義できます。もし、属性という手段と要素という手段の両方が getter や setter の定義に使われた場合、要素の手段のものは無視されます。
</p><p>getter は、プロパティが呼び出されたときにその戻り値が返されるスクリプトを含みます。setter は、プロパティに新しい値がセットされたとき呼び出されるスクリプトを含みます。スクリプトの中では、<code>val</code> という単語は新しい値を表すために使われます。setter は、代入の連鎖 (例:<code>a = this.b = c;</code>) が成功するのを許すために実行結果として <code>val</code> を返します。
</p><p>プロパティは <code>readonly</code> 属性を使って定数として指定することもできます。この属性を <code>true</code> にセットすると、プロパティの値は変更不能となります。プロパティが readonly (読み取り専用) であってsetter が定義されていたら、setter は無視されます。
</p><p>プロパティは無名コンテント要素へ呼び出しや代入を転送する getter や setter を定義するための短縮文法もサポートしています。<code>element</code> 属性は、プロパティを得るかプロパティをセットするときに使われるべきバウンド要素の下の無名コンテントのIDを定義します。
</p><p>無名コンテント要素上で、プロパティは要素上の属性か要素上のプロパティのどちらかから呼び出すことができます。<code>property</code> 属性の値は無名コンテント要素上で使うプロパティの名前を定義します。<code>attribute</code> 属性は無名コンテント要素上で使う属性の名前を定義します。もしこれらの属性のいずれかが <code>property</code> 要素上で定義されていたら、定義されたどの getter も setter も無視されます。生の初期値もまた無視されます。property と attribute の両方が定義されると、プロパティは優先され、属性は無視されます。
</p>
<h2 name=".E5.AE.9F.E8.A3.85.E3.81.AE.E7.B6.99.E6.89.BF"> 実装の継承 </h2>
<p>継承のつながりの二つのバインディング両方に実装があるとき、派生したバインディングの実装は基底となるバインディングの実装から継承されます。メソッドとプロパティの照合は動的です。曖昧さをなくすことなしに、二つのバインディングが同じメソッドかプロパティを定義するなら、もっとも派生したバインディングのメソッドかプロパティが使われます。
</p><p>バインディングが DOM 要素を拡張するため、バインディングは DOM 要素上に本来備えているどのメソッドとプロパティをもオーバーライド (上書き) することができます。たとえば、バインディングは <code>Element</code> 上の <code>setAttribute</code> メソッドや、<code>HTMLInputElement</code> のための <code>value</code> プロパティの回収のオーバーライド (上書き) をすることもできるでしょう。
</p><p><i>以下は現在のところ Mozilla には実装されていないようです。</i>
</p><p>実装は、<code>implementation</code> 要素上で定義された <code>name</code> 属性を使って名付けることもできます。実装が名前 (name) を持つとき、その名前は望みのメソッドやプロパティの曖昧さをなくすのに使うこともできます。
</p><p>{{mediawiki.external('編集者メモ: 以下の段落で、基底クラスのメソッドやプロパティへのアクセスを JavaScriptでどうアクセス可能にするかについての文法を提案しています。これは開かれた課題です。私たちは言語に独立した概念の定義や、基底バインディングのメソッドとプロパティへアクセスを可能とするものの定義を試みる必要があるでしょうか?')}}
</p><p>たとえば、<code>ColorPicker</code> 実装から派生した <code>ColorPickerGrid</code> があり、その両方で <code>setColor</code> メソッドが定義されているバインディングがあると、以下のような文法で <code>ColorPicker</code> のメソッドを呼び出すことができます。
</p>
<pre>... // myElement は ColorPickerGrid です
myElement.ColorPicker.setColor(); // ColorPicker メソッドを呼び出します
myElement.setColor(); // ColorPickerGrid メソッドを呼び出します
...
</pre>
<p>明確に基底クラスの名称を記述する方法が可能なのに加えて、<code>baseBinding</code> という名前を基底クラスが何かを知る必要がなく基底バインディング上のメソッドやプロパティを特定するために使うことができます。これは、例えば <code>addBinding</code> を使ったときなど、バインディングが暗黙に継承されたときに必要が生じます。
</p>
<pre>myElement.baseBinding.setColor(); // ColorPicker メソッドを呼び出します
</pre>
{{ wiki.languages( { "en": "en/XBL/XBL_1.0_Reference/Binding_Implementations" } ) }}
このリビジョンへ戻す