に子がない場合i
、getChild
は戻りundefined
、ループから抜け出します。
記事の次のテキストを検討してください。
GalleryImage クラスを作成します。GalleryComposite とまったく同じメソッドをすべて使用していることに注意してください。言い換えれば、それらは同じインターフェースを実装しますが、画像は葉であるため、子に関するメソッドに対して実際には何もしません。複合要素は別の複合要素を追加するのかリーフを追加するのかを認識しないため、複合要素が機能するには同じインターフェイスを使用する必要があります。
のコンストラクタを考えてみましょうGalleryImage
:
var GalleryImage = function (src, id) {
this.children = [];
this.element = $('<img />')
.attr('id', id)
.attr('src', src);
}
そして、画像と合成物がどのように構築されるか:
var container = new GalleryComposite('', 'allgalleries');
var gallery1 = new GalleryComposite('Gallery 1', 'gallery1');
var gallery2 = new GalleryComposite('Gallery 2', 'gallery2');
var image1 = new GalleryImage('image1.jpg', 'img1');
var image2 = new GalleryImage('image2.jpg', 'img2');
var image3 = new GalleryImage('image3.jpg', 'img3');
var image4 = new GalleryImage('image4.jpg', 'img4');
gallery1.add(image1);
gallery1.add(image2);
gallery2.add(image3);
gallery2.add(image4);
container.add(gallery1);
container.add(gallery2);
画像には子を含めることができないためthis.children
、空の配列のままになります。そのため、hide
関数が最終的に画像 (複合ツリーの葉の 1 つ) で呼び出されると、ループはthis.children[0]
どちらが を返すかを評価しようとしundefined
ます。これにより、コードnode = this.getChild(i)
が「false」値に評価され、その特定のfor
ループが終了します。したがって、無限ループを防ぎます。