Javascript的一种代码结构方式——插件式

上几周一直在做公司的webos的前端代码的重构,之中对javascript的代码进行了重构(之前的代码耦合严重、拓展、修改起来比较困难),这里总结一下当中使用的一种代码结构——插件式(听起来怎么像独孤九剑一样.....)。

代码结构

 这直接上代码结构图(Javascript部分)

ps:箭头的指向A->B,表示A调用B

由上面可以看到四种类型的东西:

控制类:提供一个全局的命名空间、保存上下文信息、组件、组件提供的全局方法,负责调用组件初始化。

代码示例如下(不完整):

var webos= {
    context :{},
    components : [], //所有组件
    methods : {},  //组件提供的方法

    //webos入口
    load : function(webosContext) {
        webos._init();
        webos._uiRender() ;
        webos._dataRender();
        webos._eventRender();
    },

    //初始化
    _init : function(){
        $(webos.components).each(function(index, component){
            component.init(webos.context) ;
        });
    },

    //ui渲染
    _uiRender : function(){
    },

    //数据加载
    _dataRender : function(){
    },

    //绑定事件
    _eventRender : function(){
    },

    //注册全局方法
    addGlobalMethod : function(methodName, method){
    },

    //调用全局方法
    execGlobalMethod : function(methodName, params){
    },

    //注册组件
    registerComponent : function(component) {
        webos.components.push(component);
    }
};

工具类:提供工具方法,不属于组件和基础类的方法将会放在这里。

webos.utils = {
  ...
} 

基本类:最基础的类,供给组件使用,原则上一个能称为对象的东西都应该写成一个类。
例,下面组件的接口实现类:

var IComponent = function() {
    this.init = function(context){};
    this.uiRender = function(context){};
    this.dataRender = function(context){};
    this.eventRender = function(context){};
    this.reload = function(){};
}

组件:例如导航栏、工具栏、任务栏、桌面组件,都是以一个组件形式存在。

在组件里面,组件的创建、初始化、数据渲染、事件绑定都自己解决(有点像自治区)。

//导航栏组件
;(function(webos){

    var NavBar = function() {
    };

    //继承Component基类
    NavBar.prototype = new IComponent();

    NavBar.prototype.init = function(context) {
    };

    //定位为构建基础的HTML
    NavBar.prototype.uiRender = function(context){
    };

    //加载数据
    NavBar.prototype.dataRender = function(context){
    };

    NavBar.prototype.eventRender = function(context){
    };
    ....

    //注册组件
    webos.registerComponent(new NavBar());
})(webos);

组件之间怎么联系呢?

组件与组件之间进行沟通的手段只有一个——就是将自己给其他组件使用的方法提供给控制器(调用控制器的addGlobalMethod),控制器保存你的方法,当其他组件使用你的方法时候,就向控制器要(调用控制器的execGlobalMethod )。

为啥这种结构叫插件式呢?

看过控制类和组件的代码就知道,控制类只负责帮助调用已经注册到控制类里的组件的初始化方法、组件完成关于自己的所有事。所以当我们需要做一个新的组件时候,只需完成自身的创建、渲染、事件绑定,然后注册到控制类里,控制类就会帮你初始化,组件间互不干涉,这就是插件式(好吧,这是我的理解,并没有这种官方的定义)!!! 

优点?

1、组件的维护、拓展非常简单,因为都是独立开来

2、添加新组件对已存在的组件几乎没有影响(当然你写的组件也不要影响他其他组件、例如样式、HTML)

缺点!

1、这种结构有应用场景要求,更偏向富web应用使用

转自:http://www.cnblogs.com/lovesong/p/3427855.html

时间: 2024-10-06 19:22:13

Javascript的一种代码结构方式——插件式的相关文章

JavaScript的9种继承实现方式归纳

  这篇文章主要介绍了JavaScript的9种继承实现方式归纳,本文讲解了原型链继承.原型继承(非原型链).临时构造器继承.属性拷贝.对象间继承等继承方式,需要的朋友可以参考下 不同于基于类的编程语言,如 C++ 和 Java,JavaScript 中的继承方式是基于原型的.同时由于 JavaScript 是一门非常灵活的语言,其实现继承的方式也非常多. 首要的基本概念是关于构造函数和原型链的,父对象的构造函数称为Parent,子对象的构造函数称为Child,对应的父对象和子对象分别为pare

JavaScript的9种继承实现方式归纳_javascript技巧

不同于基于类的编程语言,如 C++ 和 Java,JavaScript 中的继承方式是基于原型的.同时由于 JavaScript 是一门非常灵活的语言,其实现继承的方式也非常多. 首要的基本概念是关于构造函数和原型链的,父对象的构造函数称为Parent,子对象的构造函数称为Child,对应的父对象和子对象分别为parent和child. 对象中有一个隐藏属性[[prototype]](注意不是prototype),在 Chrome 中是__proto__,而在某些环境下则不可访问,它指向的是这个

Run As(运行方式) 的几种代码实现方式(Python和C#)

1,引入 最近因为项目的原因,需要在自动化测试代码中实现用户角色的切换,自然 第一印象就想到了Run As(中文版windows中也叫"运行方式").比如我们可 以在打开IE浏览器的时候右键单击"运行方式": 然后输入一个新的用户帐户,如下图: 上图中我本机使用的是域帐户本地帐户登陆的操作系统,但是我现在需要使 用域帐户来运行IE浏览器,以方便我在打开相应的绑定域帐户权限的页面,如公 司内部站点.这样就不用在打开相应的页面时候输入域帐户名了. 有些时候我们也可以应用

浅谈容易被百度降权的五种结构方式

俗话说的好,外链为皇,内容为王,在现在的百度严重,外链和内容是很容易让百度判断你作弊的地方,出了这2点,还有一种就是结构降权的方式,而结构降权就是自己对网站程序不是把握很好,这方面如果发生降权就是对网站产生很大的影响,因为你需要改版调整,等等,自己就简单的说下容易被百度降权的几种结构形式吧. 一:URL的标准化问题-优化代码 曾经见过一份网站,百度收录了下面四个主页,***.com,***.com/index.html,www.***.com,www.***.com/index.html,收录了

浅析四种常见的Javascript声明循环变量的书写方式_基础知识

Javascript中的循环变量声明,到底应该放在哪儿? 习惯1:不声明直接使用 function loop(arr) { for (i = 0; i < arr.length; i++) { // do something } } 非常危险的使用习惯,一般情况下循环变量将成为window对象上的一个属性被全局使用,极有可能影响程序的正常逻辑实现. 需要着重提一下的是,在strict模式下,未声明变量而直接赋值的使用方式会直接抛出异常,早就该这么做啦!引用一下ecma-262标准附录C中的一段话

Javascript中3种实现继承的方法和代码实例_javascript技巧

继承是我们在实现面向对象编程的时候很重要的一个手段.虽然我们讲不能过度继承,多利用组合代替继承,但是继承总是免不了的.这里要讨论的就是Javascript中的继承机制. Javascript中实际上是没有继承的概念的,但是我们可以通过一些手段来模仿实现它.这种继承实际上把一个对象复制到另外一个对象内部.你需要注意的是所有的本地类和宿主类是不能作为基类被继承的,主要是为了安全方面的考虑. Javascript中的继承大约有三类:1.对象冒充:2.原型继承:3.二者的混合. 一.对象冒充 其实对象冒

深入浅析JavaScript中对事件的三种监听方式_javascript技巧

事件(Event)是JavaScript应用跳动的心脏,也是把所有东西粘在一起的胶水,当我们与浏览器中Web页面进行某些类型的交互时,事件就发生了. 第一种监听方式,也是最普遍使用的方式,是直接在代码上加载事件,产生效果: <table> <tr onmouseover='this.style.backgroundColor="red"' onmouseout='this.style.backgroundColor=""'><td>

javascript密码强度校验代码(两种方法)_javascript技巧

先看效果图: javascript密码强度校验代码,具体实现思路不多说了,请看下面代码和demo. 第一种方法: /* *密码安全程度 *return :全部为字母或者数字,或者密码长度小于 *return : 字母数字组成,或者字母特殊字符,或者数字和特殊字符 *return : 字母和数字和特殊字符 */ String.prototype.passwordStrength=function(){ if(this.length> && this.length<=) retur

JavaScript中两种链式调用实现代码_javascript技巧

一.方法体内返回对象实例自身(this) 复制代码 代码如下: function ClassA(){ this.prop1 = null; this.prop2 = null; this.prop3 = null; } ClassA.prototype = { method1 : function(p1){ this.prop1 = p1; return this; }, method2 : function(p2){ this.prop2 = p2; return this; }, metho