JavaScript设计模式——前奏

 1     Function.prototype.method = function(name,fn){
 2         this.prototype[name] = fn;
 3     }
 4     var Anim = function(){
 5         //----
 6     };
 7     Anim.method("start",function(){
 8         //----
 9     })
10     Anim.method("stop",function(){
11         //----
12     })
 1     //方法的链式调用
 2
 3     Function.prototype.method = function(name,fn){
 4         this.prototype[name] = fn;
 5         return this;
 6     }
 7     var Anim = function(){
 8         //----
 9     };
10     Anim.
11         method("start",function(){
12             //----
13         }).
14         method("stop",function(){
15             //----
16         })

一:首先,再回顾一下JavaScript:

1.数据类型

  原始类型:布尔型、数值型、字符串类型

  在就包括:对象类型(数组是一种特殊的对象)、函数类型

  最后就是:空类型(null)、未定义类型(undefind)

  注意:原始类型按值传送,其他数据类型则按引用传送。

  

  toString() 数值或者布尔类型转换成字符串类型。

  parseInt()   parseFloat() 把字符串转换成数值。

  双重非(var bool = !! num;) 把字符串转换成布尔值。

2. 闭包:

  闭包是一个受保护的变量空间,由内嵌函数生成。JavaScript具有函数级的作用域。这意味着函数内部的变量函数外部不能访问。JavaScript的作用域是词法性质的。这意味着函数运行在定义它的作用域中,而不是在调用它的作用域中。这样就可以创建私有变量:

 1     var baz;
 2     (function(){
 3         var foo = 1;
 4         var bar = 2;
 5         baz = function(){
 6             retrun foo*bar;
 7         }
 8     })
 9
10     baz();

3. 对象的易变性:

  对实例化的对象进行扩展。比如给一个实例加一个方法或者给一个函数加一条属性。

  与之相关的还有内省的概念:可以在运行时检查对象所具有的属性和方法,还可以使用这种信息动态实例化类和执行其方法。(这种技术称为反射)---(我对此的概念有点模糊,日后补充。嘿嘿......)

二:接口:

  JavaScript模仿接口的三种方法:注释法、属性检查法、鸭式辨型法。

  1.注释法:

  注释法简单,但是,嘿嘿。效果最差。

 1     /*
 2     interface jk{
 3         function add(child);
 4         function remove(child);
 5         function get(child);
 6     }
 7     */
 8     var sx = function(){
 9         //------
10     }
11     sx.prototype.add = function(){
12         //------
13     }
14     sx.prototype.remove = function(){
15         //------
16     }
17     sx.prototype.get = function(){
18         //------
19     }

  看懂了吧。。加个注释你就想让人家按你的规范了。我才不呢。。。。任性,反正不安你的来不会报错,而且对测试和调试没什么卵用!!

  2.属性检查法:

 1     /*
 2      interface jk{
 3         function add(child);
 4         function remove(child);
 5         function get(child);
 6      }
 7      interface jk_two{
 8         function save(child);
 9      }
10      */
11     var sx = function(id,method,action){
12         this.impletementsInterfaces = [‘jk‘,‘jk_two‘];
13     }
14
15     function addForm(formInstance){
16         if(!impletements(formInstance,‘jk‘,‘jk_two‘)){
17             throw new Error("Object does not implement a required interface.")
18         }
19     }
20
21     function impletements(object){
22         for(var i = 1; i<arguments.length; i++){
23             var interfaceName = arguments[i];
24             var interfaceFound = fale;
25             for(var j = 0; j<object.impletementsInterfaces.length; j++){
26                 if(object.impletementsInterfaces[j] == interfaceName){
27                     interfaceFound = true;
28                     break;
29                 }
30             }
31
32             if(!interfaceFound)
33              return false;
34         }
35         return true;
36     }

  3.鸭式辨型法:

 1     var Composite = new Interface(‘Composite‘,[‘add‘,‘remove‘,‘getChild‘]);
 2     var FormItem = new Interface(‘FormItem‘,[‘save‘]);
 3
 4     var CompositeForm = function(id, method, action){
 5         //.......
 6     }
 7
 8     //.......
 9
10     function addForm(formInstance){
11         ensureImplements(formInstance, Composite, FormItem);
12         //如果有一个接口的方法没有被继承,这个方法会抛出一个错误。。。。
13     }

  

  接下来说一下结合第一种和第三种方法的接口实现:

  

 1     var Composite = new Interface(‘Composite‘,[‘add‘,‘remove‘,‘getChild‘]);
 2     var FormItem = new Interface(‘FormItem‘,[‘save‘]);
 3
 4     var CompositeForm = function(id, method, action){
 5         //.......
 6     }
 7
 8     //.......
 9
10     function addForm(formInstance){
11         Interface.ensureImplements(formInstance, Composite, FormItem);
12         //如果有一个接口的方法没有被继承,这个方法会抛出一个错误。。。。
13     }
14
15     //----下面是Interface类
16
17     var Interface = function (name, methods) {
18         if(arguments.length !=2){
19             throw new Error("Interface constructor called with " + arguments.length + "arguments, but expected exactly 2.")
20         }
21
22         this.name = name;
23         this.methods = [];
24         for(var i = 0, len = methods.length; i < len; i++){
25             if(typeof methods[i] !== ‘string‘){
26                 //接口构造函数希望将方法名称传递给字符串
27                 throw new Error("Interface constructor expects method names to be" + "passed in as a string")
28             }
29             this.methods.push(methods[i])
30         }
31     };
32     //静态类方法
33     Interface.ensureImplements = function(object){
34         if(arguments.length < 2){
35             //函数 interface.ensureimplements 称有2个参数,但预计至少2。
36             throw new Error("Function Interface.ensureImplements called with " + arguments.length + "arguments, but expected at least 2.")
37         }
38         for(var i = 1, len = arguments.length; i < len; i++){
39             var interface = arguments[i];
40             if(interface.constructor !== Interface){
41                 throw new Error("Function Interface.ensureImplements expects arguments" + "two and above to be instances of Interface.")
42             }
43             for(var j = 0, methodsLen = interface.methods.length; j < methodsLen; j++){
44                 var method = interface.methods[j];
45                 if(!object[method] || typeof object[method] !== ‘function‘){
46                     //没有继承 xx 接口,方法 xx 没有发现
47                     throw new Error("Function Interface.ensureImplements:object does not implement the " + interface.name + " interface.Method" + method + " was not found.")
48                 }
49             }
50         }
51     }

  

关于使用接口,自己权衡利弊

  

三:封装和信息隐藏:

  后续补充----------请期待........

    

时间: 2024-08-11 03:44:57

JavaScript设计模式——前奏的相关文章

JavaScript设计模式 - 迭代器模式

迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示. 迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素 许多浏览器都支持 Javascript 的 Array.prototype.forEach 迭代器可以分为 内部迭代器 和 外部迭代器 一.jQuery 中的迭代器 1 $.each( [1,2,3,4], function (i, n) { 2 console.log( "当

javascript设计模式详解之命令模式

每种设计模式的出现都是为了弥补语言在某方面的不足,解决特定环境下的问题.思想是相通的.只不过不同的设计语言有其特定的实现.对javascript这种动态语言来说,弱类型的特性,与生俱来的多态性,导致某些设计模式不自觉的我们都在使用.只不过没有对应起来罢了.本文就力求以精简的语言去介绍下设计模式这个高大上的概念.相信会在看完某个设计模式之后有原来如此的感慨. 一.基本概念与使用场景: 基本概念: 将请求封装成对象,分离命令接受者和发起者之间的耦合. 命令执行之前在执行对象中传入接受者.主要目的相互

javascript设计模式

javascript设计模式 阅读目录 什么是设计模式 单体模式: 工厂模式: 单例模式 观察者模式(发布订阅模式) 策略模式 模板模式 代理模式 外观模式 设计模式太多了,貌似有23种,其实我们在平时的工作中没有必要特意去用什么样的设计模式,或者你在不经意间就已经用了设计模式当中的一种.本文旨在总结平时相对来说用的比较多的设计模式. 回到顶部 什么是设计模式 百度百科: 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 使用设计模式是

javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)

类似于幻灯片的切换效果,有时需要在网页中完成一些图片的自动切换效果,比如广告,宣传,产品介绍之类的,那么单纯的切就没意思了,需要在切换的时候通过一些效果使得切换生动些. 比较常用之一的就是窗帘切换了. 先贴上完成的效果. 实现原理不复杂,在动的一条一条的称之为“窗帘条”或者是“strip”,每一个strip都是一个div,类似于雪碧图的方式将其背景图的位置设置为strip的可视位置,然后用jquery的animate让他们按照一定规律动起来就完成窗帘切换效果了. 为了使用方便,将这个功能作为jq

Javascript设计模式系列三

继承,一个类或对象继承另一个类或对象的三种方法.类式继承.原型式继承.掺元类. 一.类式继承,原型链.Extend函数. <script type="text/javascript"> ////定义Person类 var Person = function (name) { this.name = name; }; Person.prototype.getName = function () { return this.name; }; ////原型链 function A

Javascript设计模式系列二

创建对象的基本模式,一.门户大开型,二.采用下划线来表示属性和方法的私用性,三.使用闭包来创建私用的成员. 一.门户大开型.只能提供公用成员.所有属性和方法都公开的.可访问的.这些共用属性都要使用this关键字来创建. <script type="text/javascript"> ////定义Dog对象 var Dog = function (name, age) { this.name = name; this.age = age; } Dog.prototype.Sa

《Javascript 设计模式》-读书笔记

第七章   设计模式类别 一.设计模式有三种类别 1.创建型模式:专注于处理对象机制.包括:构造器.工厂.抽象.原型.单例.生成器 2.结构型模式:用于找出在不同对象之间建立关系密切的简单方法. 包括:装饰者.外观.享元.适配器.代理 3.行为模式:用于改善或简化系统中不同对象之间的通信.包括:迭代器.中介者.观察者.访问者 第八章   设计模式分类 <Javascript 设计模式>-读书笔记,布布扣,bubuko.com

【读书笔记】读《JavaScript设计模式》之观察者模式

一.定义 在事件驱动的环境中,比如浏览器这种持续寻求用户关注的环境中,观察者模式(又名发布者-订阅者(publisher-subscripber)模式)是一种管理人与其任务之间的关系(确切地讲,是对象及其行为和状态之间的关系)的得力工具.用JavaScript的话来说,这种模式的实质就是你可以对程序中某个对象的状态进行观察,并且在其发生改变时能够得到通知. 二.例子 我们需要一个发布者的构造函数,它为该实例定义了一个类型为数组的属性,用来保存订阅者的引用. function Publisher(

方法的链式调用【参考javascript设计模式第6章】

对应经常使用jquery的朋友,方法的链式调用应该是已经很属性了,书上有模拟出一个很简单的类库代码, 见代码如下: Function.prototype.method = function(name,fn){ this.prototype[name] = fn; return this; }; (function(){ function _$(els){ ........ } /*Events  addEvent getEvent*/ _$.method("addEvent",func