如今的前端开发越来越oo,也越来越注重重用,娴熟的用js写出oo的前端代码已然是一个前端工程师的基本素质之一。从js语言的角度来看,模块是一个单体,单体有三类,简单对象单体,函数单体,原型单体,简单单体是最简单的一种写法,仅仅用一个大的对象将内聚的变量和方法包住,但由于没有封装,因此这种单体并不安全,而且一个单体在一个运行时只能有一个。函数单体是oo的一种基本型,他包含了封装和构造,是否用构造则取决于对象的特性,如果会大量使用的话,建议使用构造。原型单体是最高效的单体,在生成对象的时候不会浪费内存空间。
但有时候实现不像单体这么简单,比如在一个复杂的页面中包含有多个逻辑,多个逻辑中都有各自的命名空间,每个命名空间有自己实现的模块,每个模块依赖于其他子模块。这样一个页面的代码应当如何规划?其实类似这样复杂的页面代码的规划是一个很有渊源的话题,应当专门花时间来讨论,总言之,简单单体用作逻辑的命名空间,函数单体用作简单构造,比如实现模块中的一个内聚但不重用的子模块,原型单体用来专门封装一个高重用率的组件。
在开发过程中,使用一个对象的时候,往往不是初始化一次就不管了,页面交互过程中也会有对这个对象的重新生成和调用。因此在yui3这样的闭包中应当注意将对象搞成全局的,可以通过hook抓得到。但最常用的是render和init,init期望参数一次传递完,render期望能重新传递一些状态相关的参数。在构造对象的时候,传参和渲染应当分离,因为有时我们只会很粗暴的new sth(config)完事,那如果对象状态更改需要重新渲染难道要重新new一遍?所以在构造完成后建议返回对象本身,然后再执行render,例如:
var k = new sth(config).render();
当需要重新渲染这个对象的时候则只需render即可,render可以带去新的参数
k.render(new_config);
而有时我们则希望增加init,以便让代码更加语义,init意指初始化,render意指渲染。这里的初始化和渲染语义很接近,在实现上有一点差别,在new的时候会执行init,init包含初始化参数和render,init中的初始化参数若有留空则需一些默认值替代,在render中的参数初始化则只是覆盖原有参数。为此用两个函数来负责两种参数的处理:buildParam和parseParam,buildParam中负责构造所有的必要参数。在tb的新项目中写的simpleditor模块用了这种结构:
YUI.namespace('T.tbwidget.simpleditor');
YUI.add('t-simpleditor',function(Y){
T.tbwidget.simpleditor = function(){
this.init.apply(this,arguments);
};
//扩展prototype
Y.mix(T.tbwidget.simpleditor, {
buildParam:function(cfg){
var that = this;
//初始化时的必要字段
var id = that.id = cfg.id;
//初始化时的可选字段
var smtemplet = that.smtemplet = (typeof cfg.smtemplet == 'undefined')?'[face]':cfg.smtemplet;
return {
id:id,
smtemplet:smtemplet
};
},
parseParam:function(cfg){
var that = this;
var cfg = cfg || {};
//处理临时参数
var id = typeof cfg.id == 'undefined'?that.id:cfg.id;
var smtemplet = (typeof cfg.smtemplet == 'undefined')?that.smtemplet:cfg.smtemplet;
return {
id:id,
smtemplet:smtemplet
};
},
render:function(cfg){
var param = this.parseParam(cfg);
//初始化代码...
},
init:function(cfg){
this.buildParam(cfg);
this.render.call(this,cfg);
},
otherFoo:function(){
}
}, 0, null, 4);
});
在构造的时候调用了一次init,就像这样
T.tbwidget.simpleditor = function(){
this.init.apply(this,arguments);
};
这样有一个好处,就是若该模块用到一些依赖的时候,只需加一个loader,在loader完成之后执行init就可以了,在ebook项目中的评论组件就是用这种方法,执行init之前先加载皮肤。
T.tbwidget.tbrr = function(){
var that = this;
var args = arguments;
var skin = (typeof arguments[0].skin == 'undefined')?'':arguments[0].skin;
YUI({modules:{
'tbrr-skin':{
fullpath:skin,
type:'css'
}
}}).use('tbrr-skin',function(Y){
that.init.apply(that,args);
});
};
让我们在返璞归真一下,实现一个最简单的链式调用,在每次函数调用结束后都返回自己,像这样
var mojoClass = function(){
this.render = function(){
return this;
};
this.init = function(){
return this;
};
this.buildParam = function(){};
this.parseParam = function(){};
};
分享到:
相关推荐
《深入理解YUI3:基于yui3-master.zip的探讨》 YUI(Yahoo! User Interface Library)是由雅虎公司开发的一套开源JavaScript库,它为Web开发者提供了丰富的功能和工具,以创建交互性强、性能优秀的网页应用。YUI3是...
“【YUI组件】基于YUI的表单验证器”指的是一个使用Yahoo用户界面库(YUI)开发的特定组件,它的主要功能是为HTML表单提供验证功能。YUI是一个开源的JavaScript库,它包含了丰富的工具和组件,用于创建交互式、高...
YUI3是YUI的第三个主要版本,它在设计时注重模块化、可扩展性和性能优化,提供了一系列用于处理DOM操作、事件处理、动画效果、Ajax通信、数据存储等任务的工具。本教程将带你入门YUI3的基础知识。 **模块化设计** ...
1. **模块系统**:YUI3引入了模块化设计,允许开发者按需加载组件,降低页面的初始化时间。模块可以通过`YUI.use()`方法来加载,实现了代码的异步加载和依赖管理。 2. **事件系统**:YUI的事件处理机制强大且灵活,...
前端技术分享 - 复杂表单与解耦是基于YUI的复杂度解耦技术,主要讲解了如何使用模块化和事件驱动的架构来解决复杂表单的耦合问题。 模块化架构 在前端开发中,模块化架构是非常重要的。它可以帮助我们将复杂的系统...
《深入理解YUI:基于“yui.rar 例子”的解析》 YUI,全称Yahoo! User Interface Library,是雅虎公司推出的一款开源JavaScript库,旨在帮助开发者构建高性能、易于维护的网页应用。本篇文章将结合“yui.rar 例子”...
总之,YUI 3.8.1作为一款成熟的前端开发库,以其模块化、高性能和广泛的功能,深受开发者喜爱。它不仅简化了前端开发工作,也为构建复杂、高性能的Web应用提供了强有力的支持。对于希望提升Web开发技能的程序员来说...
1. **YUI 3.0架构**:YUI 3采用了模块化设计,允许开发者按需加载组件,降低了页面加载时间。每个模块都有独立的命名空间,避免了全局变量污染。 2. **核心组件**:YUI 3的核心组件包括事件处理、DOM操作、动画效果...
3. **拖放功能**:YUI的DragDrop模块提供了强大的拖放功能,使得用户可以轻松地在页面上移动元素,这对于构建交互式应用非常关键。 4. **日期和时间选择器**:YUI Calendar组件提供了一个用户友好的日历界面,可以...
首先,YUI提供了一系列强大的DOM操作工具,例如`YAHOO.util.Dom.get`用于通过ID查找页面元素,类似于`document.getElementById`。`YAHOO.util.Dom.getElementsBy`则允许开发者基于特定的筛选条件和标签名在DOM树中...
5. **动画效果**:YUI的Animation模块提供了一系列方法来创建平滑的CSS属性变化动画,如淡入淡出、滑动、缩放等,使得动态效果的实现变得直观且高效。 6. **CSS样式和布局**:YUI还提供了一些预定义的CSS样式和响应...
在YUI中,`yui-slideshow`是一款基于Ajax的幻灯片展示组件,能够帮助开发者轻松创建出交互式的图片或内容轮播效果。 **一、YUI Slideshow的核心特性** 1. **异步加载**:YUI Slideshow支持动态加载内容,可以使用...
3. **初始化YUI**:调用`YUI().use()`方法初始化YUI,并传入需要的模块。 4. **编写代码**:在回调函数中编写具体的应用逻辑,使用YUI提供的API。 **四、YUI与其他JavaScript库的比较** YUI与jQuery、Dojo、...
YUI的核心由一系列模块组成,这些模块可以按需加载,避免了不必要的资源浪费。常见的模块包括: - **yuiloader**: 负责模块的加载和依赖管理。 - **event**: 处理DOM元素的事件绑定和解绑。 - **dom**: 提供DOM操作...
基于NodeJS构建的YUI 3组合处理程序,支持单个模块和模块捆绑的版本控制。 与其他组合处理程序相比,显着的进步是您可以随时上传单个模块或捆绑软件的新版本,但这不会破坏现有的应用程序,因为旧版本仍然可用。 ...
首先,AUI(Alloy UI)是基于YUI(Yahoo User Interface Library)的一个扩展,它提供了更多的组件和设计模式,旨在简化和加速Web应用的开发。AUI YUI Alloy2.0的发布,意味着这个框架在原有的基础上,进一步强化了...
淘宝旅行YUI通用日期日历控件是一款基于Yahoo! UI Library (YUI) 开发的前端组件,主要用于在网页上实现高效、用户友好的日期选择功能。YUI 是一个广泛应用于网页开发的开源JavaScript库,它包含了一系列模块,用于...
标题“YUI 3 Live Messaging-开源”揭示了我们讨论的是一个基于YUI 3框架的开源实时消息传递模块。YUI (Yahoo! User Interface Library) 是由雅虎开发的一个开源JavaScript库,旨在帮助开发者构建高性能、可访问且...
Alloy_Liferay是一款基于YUI(Yahoo User Interface Library)封装的框架,主要用于Liferay Portal的开发和扩展。这款框架集成了YUI的强大功能,为开发者提供了一套高效、灵活的工具集,以简化Liferay应用的构建过程...
Kissy是由淘宝网开发的一款高性能的轻量级JavaScript库,它借鉴了YUI3的模块化设计思想,为前端开发提供了强大的工具集。Kissy的核心模块化实践可以分为两大部分:核心模块和业务应用模块。 ##### 2.1 Kissy核心...