Function.prototype.method = function(name,fn){
this.prototype[name] = fn;
}
var Anim = function(){
//----
};
Anim.method("start",function(){
//----
})
Anim.method("stop",function(){
//----
})
     //方法的链式调用

     Function.prototype.method = function(name,fn){
this.prototype[name] = fn;
return this;
}
var Anim = function(){
//----
};
Anim.
method("start",function(){
//----
}).
method("stop",function(){
//----
})

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

1.数据类型

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

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

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

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

  

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

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

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

2. 闭包:

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

     var baz;
(function(){
var foo = 1;
var bar = 2;
baz = function(){
retrun foo*bar;
}
}) baz();

3. 对象的易变性:

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

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

二:接口:

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

  1.注释法:

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

     /*
interface jk{
function add(child);
function remove(child);
function get(child);
}
*/
var sx = function(){
//------
}
sx.prototype.add = function(){
//------
}
sx.prototype.remove = function(){
//------
}
sx.prototype.get = function(){
//------
}

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

  2.属性检查法:

     /*
interface jk{
function add(child);
function remove(child);
function get(child);
}
interface jk_two{
function save(child);
}
*/
var sx = function(id,method,action){
this.impletementsInterfaces = ['jk','jk_two'];
} function addForm(formInstance){
if(!impletements(formInstance,'jk','jk_two')){
throw new Error("Object does not implement a required interface.")
}
} function impletements(object){
for(var i = 1; i<arguments.length; i++){
var interfaceName = arguments[i];
var interfaceFound = fale;
for(var j = 0; j<object.impletementsInterfaces.length; j++){
if(object.impletementsInterfaces[j] == interfaceName){
interfaceFound = true;
break;
}
} if(!interfaceFound)
return false;
}
return true;
}

  3.鸭式辨型法:

     var Composite = new Interface('Composite',['add','remove','getChild']);
var FormItem = new Interface('FormItem',['save']); var CompositeForm = function(id, method, action){
//.......
} //....... function addForm(formInstance){
ensureImplements(formInstance, Composite, FormItem);
//如果有一个接口的方法没有被继承,这个方法会抛出一个错误。。。。
}

  

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

  

     var Composite = new Interface('Composite',['add','remove','getChild']);
var FormItem = new Interface('FormItem',['save']); var CompositeForm = function(id, method, action){
//.......
} //....... function addForm(formInstance){
Interface.ensureImplements(formInstance, Composite, FormItem);
//如果有一个接口的方法没有被继承,这个方法会抛出一个错误。。。。
} //----下面是Interface类 var Interface = function (name, methods) {
if(arguments.length !=2){
throw new Error("Interface constructor called with " + arguments.length + "arguments, but expected exactly 2.")
} this.name = name;
this.methods = [];
for(var i = 0, len = methods.length; i < len; i++){
if(typeof methods[i] !== 'string'){
//接口构造函数希望将方法名称传递给字符串
throw new Error("Interface constructor expects method names to be" + "passed in as a string")
}
this.methods.push(methods[i])
}
};
//静态类方法
Interface.ensureImplements = function(object){
if(arguments.length < 2){
//函数 interface.ensureimplements 称有2个参数,但预计至少2。
throw new Error("Function Interface.ensureImplements called with " + arguments.length + "arguments, but expected at least 2.")
}
for(var i = 1, len = arguments.length; i < len; i++){
var interface = arguments[i];
if(interface.constructor !== Interface){
throw new Error("Function Interface.ensureImplements expects arguments" + "two and above to be instances of Interface.")
}
for(var j = 0, methodsLen = interface.methods.length; j < methodsLen; j++){
var method = interface.methods[j];
if(!object[method] || typeof object[method] !== 'function'){
//没有继承 xx 接口,方法 xx 没有发现
throw new Error("Function Interface.ensureImplements:object does not implement the " + interface.name + " interface.Method" + method + " was not found.")
}
}
}
}

  

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

  

三:封装和信息隐藏:

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

    

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

  1. JavaScript设计模式——前奏(封装和信息隐藏)

    前面一篇讲了js设计模式的前奏,包括接口的讲解.. 三:封装和信息隐藏: 信息隐藏用来进行解耦,定义一些私有的数据和方法. 封装是用来实现信息隐藏的技术,通过闭包实现私有数据的定义和使用. 接口在这其 ...

  2. 《JavaScript设计模式 张》整理

    最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...

  3. 《JavaScript设计模式与开发实践》整理

    最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...

  4. Javascript设计模式学习一

    学习Javascript设计模式之前,需要先了解一些相关知识,面向对象的基础知识.this等重要概念,以及掌握一些函数式编程的技巧. Js多态 多态的思想:实际上是把“做什么”和“谁去做”分离开来.例 ...

  5. javascript设计模式实践之职责链--具有百叶窗切换图片效果的JQuery插件(三)

    在上一篇<javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)>里,通过采用模板方法模式完成了切换效果对象的构建编写. 接下来就是完成各效果对象的调 ...

  6. javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)

    在上一篇<javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)>里,通过采用迭代器模式完成了各初始化函数的定义和调用. 接下来就要完成各个切换效果的编 ...

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

    类似于幻灯片的切换效果,有时需要在网页中完成一些图片的自动切换效果,比如广告,宣传,产品介绍之类的,那么单纯的切就没意思了,需要在切换的时候通过一些效果使得切换生动些. 比较常用之一的就是窗帘切换了. ...

  8. 常用的Javascript设计模式

    <parctical common lisp>的作者曾说,如果你需要一种模式,那一定是哪里出了问题.他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通用的解决方案. 不管是弱类型 ...

  9. Javascript设计模式(摘译)

    说明: 未完成...更新中.... 一.javascipt设计模式分类 设计模式分类有很多标准,最流行的三种如下 1)  creational  --  主要关注对象创建 Creational des ...

随机推荐

  1. [转] This Android SDK requires Android Developer Toolkit version 23.0.0 or above

    问题描述: This Android SDK requires Android Developer Toolkit version 23.0.0 or above.  Current version ...

  2. 【leetcode】Course Schedule(middle)☆

    There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...

  3. 用css解决iframe的自适应问题(跨域下同样有用)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  4. September 12th 2016 Week 38th Monday

    After all, tomorrow is another day. 不管怎样,明天又是全新的一天. Another day? Maybe.  Remember when you reach for ...

  5. September 1st 2016 Week 36th Thursday

    Everything is going on, but don't give up trying. 万事随缘,但不要放弃努力. There are numerous things that we ca ...

  6. 修改searchbar 取消 字体 颜色

    UIButton *cancelButton; UIView *topView = self.searchDisplayController.searchBar.subviews[]; for (UI ...

  7. elk深度解析

    上面的两张图是elk的一个架构 下面是对logstash分析:如下图 可以看出 logstash的一个角色shipper,(是通过配置文件来决定logstash是shipper还是indexer)注意 ...

  8. 《CLR via C#》读书笔记(1)CLR执行模型

    1.1 释义 CLR 公共语音运行时 Common Language Runtime CTS 通用类型系统 Common Type System CTS.CLS是CLR的核心 CLS 通用语言规范 C ...

  9. Jsonp跨域访问原理和实例

    >>什么是跨域 出于安全方面的考虑,页面中的JavaScript无法访问其他服务器上的数据,当前域名的js只能读取同域下的窗口属性,即同源策略.而跨域就是通过某些手段来绕过同源策略限制,实 ...

  10. VS使用技巧(转)

    转自http://www.cnblogs.com/xpvincent/p/3596553.html i. Ctrl-M-O 折叠所有方法 ii. Ctrl-M-P 展开所有方法并停止大纲显示(不可以再 ...