JavaScript设计模式——前奏
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设计模式——前奏的更多相关文章
- JavaScript设计模式——前奏(封装和信息隐藏)
前面一篇讲了js设计模式的前奏,包括接口的讲解.. 三:封装和信息隐藏: 信息隐藏用来进行解耦,定义一些私有的数据和方法. 封装是用来实现信息隐藏的技术,通过闭包实现私有数据的定义和使用. 接口在这其 ...
- 《JavaScript设计模式 张》整理
最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...
- 《JavaScript设计模式与开发实践》整理
最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...
- Javascript设计模式学习一
学习Javascript设计模式之前,需要先了解一些相关知识,面向对象的基础知识.this等重要概念,以及掌握一些函数式编程的技巧. Js多态 多态的思想:实际上是把“做什么”和“谁去做”分离开来.例 ...
- javascript设计模式实践之职责链--具有百叶窗切换图片效果的JQuery插件(三)
在上一篇<javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)>里,通过采用模板方法模式完成了切换效果对象的构建编写. 接下来就是完成各效果对象的调 ...
- javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)
在上一篇<javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)>里,通过采用迭代器模式完成了各初始化函数的定义和调用. 接下来就要完成各个切换效果的编 ...
- javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)
类似于幻灯片的切换效果,有时需要在网页中完成一些图片的自动切换效果,比如广告,宣传,产品介绍之类的,那么单纯的切就没意思了,需要在切换的时候通过一些效果使得切换生动些. 比较常用之一的就是窗帘切换了. ...
- 常用的Javascript设计模式
<parctical common lisp>的作者曾说,如果你需要一种模式,那一定是哪里出了问题.他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通用的解决方案. 不管是弱类型 ...
- Javascript设计模式(摘译)
说明: 未完成...更新中.... 一.javascipt设计模式分类 设计模式分类有很多标准,最流行的三种如下 1) creational -- 主要关注对象创建 Creational des ...
随机推荐
- Solr安装过程
Solr安装过程 下载相关资料 solr 4.2.0 http://lucene.apache.org/solr/ 期间安装过 solr 4.3.0 很可惜没有配置成功 apache-tomcat-7 ...
- code vs1436 孪生素数 2(数论+素数的判定)
1436 孪生素数 2 时间限制: 2 s 空间限制: 1000 KB 题目等级 : 白银 Silver 题解 查看运行结果 题目描述 Description 如m=100,n=6 则 ...
- php dirname($path) 中文路径不对问题
将$path中的\改为/ $dir=__FILE__;$dir = str_replace("\\","/", $dir);$dir=dirname($dir) ...
- [Android Pro] AOSP download
Ubuntu14.04系统下载Android源码,直接上步骤: 清华大学 TUNA 镜像源 https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/ https: ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(五) 之 加好友,加群流程,消息管理和即时消息提示的实现
前言 前前一篇留了个小问题,在上一篇中忘了写了,就是关于LayIM已经封装好的上传文件或者图片的问题.对接好接口之后,如果上传速度慢,界面就会出现假死情况,虽然文件正在上传.于是我就简单做了个图标替代 ...
- 在HTML中禁止文字的复制
很简单,只需在<body>中添加如下代码: <body oncontextmenu='return false' ondragstart='return false' onsele ...
- Java返回距离当前时间段
/** * 计算该时间离当前时间的差距 * @param time 格式为:yyyy-MM-dd HH:mm:ss * @return */ public static String getShort ...
- 《Thinking in Java》十四章类型信息_习题解
1~10 Page 318 练习1. 在ToyTest.java中,将Toy的默认构造器注释掉,并解释发生的现象. 书中代码如下(略有改动): package org.cc.foo_008; p ...
- Python下安装MySQLdb
前提是你已经安装过mysql 1.从https://pypi.python.org/pypi/MySQL-python/下载MySQL-python,然后用rz命令上传到相关目录 2.用tar -zx ...
- 以16进制打印出一块内存buff
如下代码(支持windows与Linux)会以[16进制][每行16字节]打印出一块内存的内容: void PrintBuffer(void* pBuff, unsigned int nLen) { ...