如果 , 没有孩子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
函数最终在图像上被调用时(在复合树的叶子之一处),循环将尝试评估this.children[0]
哪个将返回undefined
。这将导致代码node = this.getChild(i)
评估为“假”值,并且该特定for
循环将终止。从而防止死循环。