ー 169 索 引 字 数 号 … 28 , 116 constructor . … 42 , 112 ... 19 … 24 , 155 .. 142 .. 142 ー proto_ Date() . decodeURI() . decodeURIComponent ( ) . delete ( 演算子 ) .. DOM … DontDelete 属性 .. 爲 -8 一 1 ・ -8 11 16 進数… 8 進数… apply() . ... 63 , 70 90 arguments.. ... 63 , 66 arguments. callee.. arguments. length.. ... 68 Array() ... 8 , 36 , 43 , 107 , 112 , 125 ~ 128 , 130 , 163 , 164 Array. prototype. concat() . ... 127 Array. prototype.join() . ... 43 , 107 , 108 , 127 Array. prototype ・ pop() . .. 128 Array. prototype. push() . ... 128 Array. prototype. reverse() .. … 128 Array. prototype. shift() . ... 128 Array. prototype. slice ( ) .. … 128 Array. prototype. sort() .. … 128 Array. prototype. splice() .. ... 128 Array. prototype. toLocaleString().. ... 127 Array. prototype. t0String ( ) .. … 127 Array. prototype. unshift() .. … 128 ... 67 enc0deURI ( ) . encodeURIComponent ( ) . eval() .. eval スコープ .. -8 一 9 、戸 0 LO for-in... Function. prototype. apply().. Function. prototype. call() .. Function. prototype. toString() .. function 文… ... 46 … 63 , 70 , 90 … 63 … 64 ... 70 , 75 hasOwnProperty() . ... 57 BooIean().. Boolean. prototype. toString ( ) . B001ean. prototype. value()f() .. … 10 , 147 ~ 149 , 163 , 164 … 149 … 149 ⅲ ( 演算子 ) .. instanceof ( 演算子 ) .. isFinite ( ) . isNaN ( ) .. isPrototypeOf() .. 一 0 -0 一ワ 3 9 、つ / -4 つけ LO 「 / に 0 call() ..
ー 109 8.1 プロトタイプチェーン 0bj ect. prototype へ Array() prototype Array. prototype constructor join() (4)Array. prototype に join() が存在するので これを実行 プ索 タて ロど プた プロトタイプチェ ーン 彡 .4 myArray 0 : ' f00 ' 'bar' ② myArray に join() が存在しない ① myArray. join() を実行 myArray. join() 実行時 図 8-2 0bject. prototype へ Array ( ) prototype Array. prototype ( onst て u こ t join( ) 4 トッ事、 プロトタイプチェーン Array( ) Array( ) Array( ) Array( ) Array() インスタンス インスタンスインスタンスインスタンスインスタンス 図 8-3 すべてのインスタンスが共通の p 「 ototype からプロバティを継承する の性質をよく理解できるよう、ひとつずつ順番に説明します。しかし実は、チェーン 構造をたどる動作の特性を覚えるだけの方がうまくいくかもしれません。もし本章を 読み進める前に記憶を新たにしておきたい場合は 1 章に戻って、プロバティ値がど
ー 1 1 3 8.5 コンストラクタ関数から生成されたインスタンスはそのコンストラクタの P 「 0t0type プロバティにリンクする Object. prototype へ Array() prototype Array. prototype constructor f00 : ' f00 ' p て 0t0 ー ( 非標準プロバティ ) myArray proto__ ( 非標準プロバティ ) プロトタイプチェーン -proto-- プロバティによりプロトタイプチェーンが構成される 図 8-4 せ・ sfiddle. etrse a/NML 〃このコードは一 p て 0t0 ーにアクセスできる環境でのみ動作する Array. prototype. 千00 = 0 ・ var myArray = new Array() ; . f00 ) ; / / 出力 : f00 = Array. prototype p て 0t0 ープロバティは ECMA の公式な標準ではありません。オプジェクトが継 承するプロトタイブオプジェクトへのリンクをトレースするために利用できる一般的 な方法があります。 constructor プロバティを使う方法です。次の例で確かめてみま す。 console. 10g(myArray. ー p て 0t0 / / myArray. ー p て 0t0 d . ne s ざ証 D 、 3 var myArray = new Array() ; Array. prototype. f00 = ' f00 ' ; / / Array() のすべてのインスタンスが f00 プロバティを継承
9.2 Array() バラメータ 配列インスタンスの値をカンマ区切りでコンストラクタ関数に渡すことができます 'bar');)o Array() コンストラクタは最大 4 , 294 , 967 , 295 個の引 (new Array(' f00 ' 数を受け取ることができます。 しかし、 Array( ) コンストラクタに引数が 1 つだけしか渡されす、その引数が JavaScript によって整数と判断される場合 ( 1 、 123 、 1.0 など ) は、その引数は配列 の length の設定に使用されます。この場合、引数は要素として配列に格納する値と して使われることはありません 1 ・。 せ・ s dd net/ 、Ä〒戸〒 var f00 = new Array(), 2 , 3 ) ; / / 1 、 2 、 3 を要素として持つ配列を生成 = new Array()0 の ; / / 長さ 100 の配列を生成 ( 要素は undefined) var bar ( onsole. 10g ( f00 [ 0 ] , f00 [ (]) ; / / 出力 : ・ 1 3 ・ console. log(bar[o], bar. length); / / 出力 : 'undefined 100 ・ す 要素が整数値ひとつだけの配列を生成したい場合は、必す配列リテラルを使用する必要があります。 126 ー 訳注通常は配列の生成にリテラルを使用するため、この仕様が問題になることはほとんどありませんが、 9 章 配列 (A 「「 ay()) console. 10g(my0bject[ 'blue' ]); / / 出力 : blue NOTE ・配列はどのような型の値でも格納でき、これらの値はいつでも更新、削除することが できます。 ・ハッシュ ( 連想配列 ) が必要な場合は、 Object() オブジェクトの利用が一番近い手段 です。 ・ Array() は特別な Object() にすぎません。つまり、 Array() インスタンスは Object() インスタンスにメソッドを追加したもののようなものです (length プロバテイや、ビ ルトインの数値インデックスなど ) 。 ・配列に格納されている個々の値のことを一般的に要素といいます。
108 ー 8 章関数の p 「 ototype プロバティ .ne var myArray = new Array(' f00 ・ console. 10g(myArray. join()); / / 出力 : ・ f00 , ba て・ join( ) メソッドは myArray インスタンスでは定義されていませんが、なぜか j0in ( ) メソッドがすでに定義されているかのようにアクセスすることができます。 このメソッドはどこかで定義されているはずですが いったい、どこで ? それ は、 Array() コンストラクタの p て 0t0type プロバティに定義されています。 myArray 配列オプジェクトインスタンスでは join ( ) が見つからなかったため、 JavaScript は プロトタイプチェーンをたどって、 Array. prototype で発見した join() メソッドを 呼び出しました。図 & 1 と図 & 2 を参照してください。 さて、なせわざわざこのように継承を行うのでしようか ? それは、再利用性と効 率のためです。 Ar て ay ( ) コンストラクタ関数によって生成された配列インスタンスそ れぞれに、全く同じように動作する join ( ) メソッドをいちいち定義する必要がある とは思わないでしよう。それよりも、すべての配列インスタンスが共通の join 関数 を使った方が効率がよいことは明らかです ( 図 & 3 参照 ) 。 この効率化は、 p て ototype プロバティ、プロトタイプリンクとプロトタイプチェー ンの検索によって可能となります。本章では、混乱を招きかねないプロトタイプ継承 Array ( ) prototype Array. prototype constructor join() myArray 0 : ( f00 ' 1 : 'bar' Array ・ prototype は 0bject() インスタンスなので 0bject. prototype へチェーンが続く プロトタイプチェーン 図 8-1 myArray 生成時
目次ー prototype プロバティはすべての Function() インスタンスに XIX … 111 8.6 8.7 8.8 8.9 8.11 8.12 8.3 8.4 8.5 8.10 自動的に付与される… proto pe プロバティのデフォルト値は Object ( ) オプジェクト … 116 … 114 … 111 デフォルトの constructor プロバティを失う . proto 呼 pe プロバティに新しいオプジェクトを設定すると プロトタイプチェーンは最初に見つけたプロバティを返す… 115 プロトタイプチェーンの終着点は ()bject. prototype.. そのコンストラクタの prototype プロバティにリンクする . … 112 コンストラクタ関数から生成されたインスタンスは プロトタイプからプロバティを継承するインスタンスは常に最新 の値を取得… … 117 proto 呼 pe プロバティを新しいオプジェクトに置き換えた場合、 過去のインスタンスは更新しない . … 118 ユーザ定義コンストラクタもプロトタイプ継承を行うことが できる .. 継承チェーンを生成する .. 9 章 配列 (Array( ) ) .. 9.1 9.3 9.4 9.5 9.6 9.7 9.8 9.9 9.10 9.11 Array() オプジェクト Array( ) のインスタンスのプロバティとメソッド Array() のプロバティとメソッド .. 配列の要素を前から・後ろからループする .. 配列を配列に格納 ( 多次元配列 ) .. 配列の length を設定して要素の追加・削険 指定した数の要素を持った配列を生成する .. length とインデックス .. 要素の追加・変更 .. 配列を生成する .. (Array. prototype のプロバティ ) . … 119 … 121 … 1 25 125 131 … 130 … 130 ... 129 … 128 … 127 … 127 … 132 … 131
9.4 A 「「 ay ( ) のインスタンスのプロバティとメソッド ( A 「「 ay. p 「 ototype のプロバティ ) ー 127 9.3 Array() のプロバティとメソッド Array() オプジェクトは次のプロバティを持っています ( 継承されたプロバティと メソッドを除く ) プロ / ヾティ ・ prototype 9.4 Array() のインスタンスのプロバティとメソッド (Array. prototype のプロバティ ) A Ⅱ ay ( ) オプジェクトによって生成されたオプジェクトは以下のプロバティとメ ソッドを持っています。 インスタンスプロ / ヾティ ・ constructor ・ length 配列の要素の数を返す。 インスタンスメソッド て返す。 をセパレータとして使用し、配列の要素を 1 つの文字列として結合し カンマ ( もしくは separator に指定した文字列 ) join(separator) し、新しい配列の末尾に結合する。 て付加して、その配列を返す。引数が配列の場合は、配列を要素に分解 しい配列を生成し、引数として渡した要素をその順番に末尾の要素とし .. ] ] ] ( ) ーー元の配列の要素を持った新 concat( [iteml [ , item2 [ , ロケールによってはセパレータの文字が異なる場合がある。 toLoca1eString() —toString() と同じ結果を返すが、ホスト環境の 引数を与えない join ( ) と同じ。 toString()
44 ー 2 章オブジェクトとプロバティを扱う が生成される際、 Array. prototype が最初の「他のどこか」になります。 こまでの内容をまとめます。オプジェクト内に存在しないプロバティにアクセス しようとすると、 JavaScript はプロトタイプチェーンをたどってこのプロバティを探 しだそうとします。最初に検索する場所はオプジェクトを生成したコンストラクタ関 数 ( 本節の例の場合は Array ( ) ) の prototype オプジェクトです。 ーでも見つから ない場合、 JavaScript はその関数がさらにコンストラクタを持っ限り、プロトタイプ チェーンをさかのばります。 では、このプロトタイプチェーンはどこで終わるのでしようか ? myArray 変数を 使って探ってみましよう。今回は toLoca1eString() メソッドにアクセスしてみます。 ー e ・証 VTw ロバティが見つからす undefined が返された場合には、 JavaScript はいくつかのオプ こまでの短い記述で理解してほしいことは、プ 読んで理解を深めてみてください。 での記述の理解に自信がもてなかった場合は、 8 章を読んでから再度この節の説明を 本書の 8 章では、プロトタイプチェーンをさらに詳細に説明します。もしここま ません。 終端は 0bject. prototype です。その先に検索可能な prototype プロバティは存在し prototype の次に 0bject. prototype を検索します。そしてプロトタイプチェーンの 0bject() コンストラクタ関数によって生成されています。そのため、 Array. すべての prototype プロバティはオプジェクトなので、 Array. prototype も しました。もしここで見つからなかった場合は undefined を返していました。 t0Loca1eString() メソッドをみつけることができたので、メソッドを実行して出力 ん。 JavaScript は次に 0bject() の prototype プロバティを検索します パティを検索します。しかしここにも toLoca1eString( ) メソッドは存在しませ します。最初に myA Ⅱ ay のコンストラクタ関数である Array ( ) の p て ototype プロ たがって、 JavaScript はプロトタイプチェーンをさかのばりこのメソッドを検索 t0Loca1eString() メソッドは myAr て ay オプジェクトでは定義されていません。し console. 10g(myArray. t0Loca1eString()) ; / / 出力 : ・ f00 , bar ・ / / t0LocaleString() は 0bject. prototype. t0LocaleString で定義されている var myArray = [ ' f00 ・ / / myArray と Array. prototype は t0LocaleString() メソッドを持っていない
2.5 プロバテイへの参照はどのように解決されるのかー 43 実際の動作を確認するまではわかりづらいでしよう。ここで p 印 totype プロバティの 特性をみるために、例として配列を生成してプロトタイプメソッドを使用してみます。 / / myArray は配列オブジェクト var myArray = [ ' f00 console. 10g(myArray ・ join()); / / 動作する / / しかし、 myArray. join は実際には Array. prototype. join で定義されている myArray は配列のインスタンス、つまりプロバティとメソッドを持ったオプジェク トです。ここで配列が持つメソッド、たとえば join ( ) にアクセスしようとするとき、 どうなるかを考えてみましよう。 Array ( ) コンストラクタに生成された myAr て ay イン スタンスは join メソッドを自身で保持しているのでしようか ? has0wnProperty() 6 myArray 自身は join() メソッドを持っていませんでした。 バティを持っていない console. 10g(myArray. has0wnProperty('j0in' ) ) ; / / 出力 . false - myArray 自身は join プロ var myArray = [ ・十 00 ・ メソッドすを使って早速確認してみましよう。 しかし myArray は、さ もに ) join() メソッドが加えられましたすす。 Ar て ay ( ) のインスタンスとして myA Ⅱ ay の prototype オプジェクトのプロバティに ( 他の様々なプロバテイやメソッドとと JavaScript によって Array() コンストラクタ関数が定義された際に、 Array() 関数 た場所です。 てくることができるプロバティにアクセスしました。この「他のどこか」は決められ トが自身で持っているわけではありませんが、 JavaScript が「他のどこか」から探し チェーンを目の当たりにしたのです。この join ( ) メソッドは、 myArray オプジェク す。何が起こっているのでしようか ? そうです。たったいまあなたはプロトタイプ も自分が持っているメソッドであるかのように join ( ) メソッドにアクセスしていま す 訳注指定したプロバティがそのオプジェクト自身で定義されているかどうかを確認する has0wn property() 関数は 0bject. prototype. has0wnProperty で定義されており、 myArray. has0wnProperty() を呼 ぶことにより 0bject. prototype までプロトタイプチェーンをたどっています。 has0wnProperty() メソッ ドについては 2.6 節で説明します。 訳注 Array() インスタンスのプロバテイやメソッドは、 9.4 節で説明しています。
8.7 プロトタイプチェーンは最初に見つけたプロバティを返す一 115 console. 10g(myArray. f00); / / 出力 : ・ f00 ・ 0bject. prototype. f00 = 竏 00 ' ・ 社 :″・ sfiddle.netrse ・ a/kzJW 了し以後のチェーンをたどらないため、たとえ同じ名前の値がチェーン上で定義され ング」しています。チェーン検索時にプロバティが発見された場合はそこで検索を終 この例では、 Array. prototype. f00 の値が 0bject. prototype. f00 の値を「マスキ / / ローカルプロバティが優先される console. 10g(myArray. f00) / / 出力 : ・ bar' myArray. f00 = ' bar ' ・ console. 10g(myArray. f00); / / 出力 : ・ array-foo' var myArray = a てて ay - f00 ・・ Array. prototype. f00 = 0bject. prototype. f00 = ・ 0bject-f00 ' ・ せ : ″・ dIL.n se a/CxBBS プロトタイプチェーン上で最初に発見される A Ⅱ ay. p て ototype. f00 の値になります。 の両方に値を設定した場合、 myA Ⅱ ay. f00 にアクセスを試みた場合に返される値は、 8.6 節の例を修正します。この例で 0bject. prototype. f00 と Array. prototype. f00 で最初に見つけた値を返します。 7 章で紹介したスコープチェーンと同様に、プロトタイプチェーンもチェーン検索 プロバティを返す 8.7 プロトタイプチェーンは最初に見つけた NOTE , プにプロバティとして出現しますので注意が必要です。 0bject. prototype にプロバティを追加すると、すべてのオブジェクトに対する for-in ルー 0bject. prototype です。 チェーンの検索は Object. prototype で終了します。 f00 を探しに行く最後の場所は その値を出力 * / / * myArray. f00 、 Array. prototype. f00 は存在しないが 0bject. prototype. f00 が存在するため