们,我们的两个私有变量就不会被销毁。
4. 实践这个模式。让我们来看看这个模式的一个常见应用案例。假设你有一个列表,列表上的一些项可以被拖拽。应用拖拽的项上有拖拽的CSS类。
<!--这个脚本文件包含所有的YUI实用程序--> <script type="text/javascript" src="http://yui.yahooapis.com/2.2.2/build/utilities/ utilities.js"></script> <ul id="myList"> <li class="draggable">一项</li> <li>二项</li> <!--二项将不能被拖拽--> <li class="draggable">三项</li> </ul> <script> YAHOO.namespace("myProject"); YAHOO.myProject.myModule = function () { //YUI实用程序的私有简写引用: var yue = YAHOO.util.Event, yud = YAHOO.util.Dom; //私有方法 var getListItems = function () { // 注意这个地方使用其他的私有变量,包括"yud"YAHOO.util.Dom的简写: var elList = yud.get("myList"); var aListItems = yud.getElementsByClassName( "draggable", //得到仅有CSS类"draggable"的项 "li", //仅返回列表项 elList //限定搜索改元素的子 ); return aListItems; }; //这个放回的对象将变成YAHOO.myProject.myModule: return { aDragObjects: [], //可对外访问的,存储DD对象 init: function () { //直到DOM完全加载好,才实现列表项可拖拽: yue.onDOMReady(this.makeLIsDraggable, this, true); }, makeLIsDraggable: function () { var aListItems = getListItems(); //我们可以拖拽的那些元素 for (var i=0, j=aListItems.length; i<j; i++) { this.aDragObjects.push(new YAHOO.util.DD(aListItems[i])); } } }; }(); //上面的代码已经执行,所以我们能立即访问init方法: YAHOO.myProject.myModule.init(); </script>
这是一个简单的例子,特意写的详细一些——如果按照这种方式做,我们无疑能把它写的更紧凑。当项目变得更加复杂和它的API增加, |