学习Javascript设计模式之前,需要先了解一些相关知识,面向对象的基础知识、this等重要概念,以及掌握一些函数式编程的技巧。

Js多态

  多态的思想:实际上是把“做什么”和“谁去做”分离开来。
例:

var makeSound = function(animal){
if(animal.show instanceof Function){
animal.show();
}
}
var dog = {
show: function(){
console.log('汪汪');
}
}
var cat = {
show: function(){
console.log('喵喵');
}
}
makeSound(dog); //输出:汪汪
makeSound(cat); //输出:喵喵

Js封装

例:

var myObject = (function(){
var name = 'hello';
return {
getName: function(){
return name;
}
}
})();
console.log(myObject.getName()); //hello
console.log(myObject.name); //undefined

this的指向:

1.当函数作为对象的方法调用时,this指向该对象

var obj = {
name: 'hello',
getName: function(){
console.log(this===obj); //true
console.log(this.name); //hello
}
}
obj.getName();

2.当函数作为普通函数调用时,this指向全局对象即window对象

window.name = 'globalName';
var getName = function(){
return this.name;
};
console.log(getName()); //globalName
//或者
window.name = 'globalName';
var myObject = {
name: 'hello',
getName: function(){
return this.name;
}
};
var getName = myObject.getName;
console.log(getName()); //globalName

3.构造器调用,构造器里的this指向返回的这个对象

var myClass = function(){
this.name = 'Class';
}
var obj = new myClass();
console.log(obj.name); //Class

4.Function.prototype.call或Function.prototype.apply调用,可以动态地改变传入函数的this

var obj1 = {
name: 'hello',
getName: function(){
return this.name;
}
};
var obj2 = {
name: 'hi'
};
console.log(obj1.getName()); //hello
console.log(obj1.getName.call(obj2)); //hi

call 和 apply
  作用是一模一样的,区别仅在于传入参数形式不同。
  apply接受两个参数,第一个参数指定了函数体内this对象的指向,第二个参数是一个带下标的集合,这个集合可以数组,也可以是类数组。

var func = function(a,b,c){
console.log([a,b,c]); //[1,2,3]
}
func.apply(null,[1,2,3]);

  这段代码中,参数1、2、3放在数组中一起传入func函数,分别对应a、b、c,第一参数为null,函数体this指向默认宿主对象,浏览器中则是window。
  call传入的参数数量不固定,第一个参数也是代表函数体内的this指向,从第二个参数起往后,每个参数依次传入函数。

call 和 apply 的用途
1.改变this指向

var obj1 = {
name: 'objName'
};
window.name = 'window';
var getName = function(){
console.log(this.name);
};
getName(); //window
getName.call(obj1); //objName

2.借用其他对象的方法

var A = function(name){
this.name = name;
};
var B = function(){
console.log(arguments);
A.apply(this,arguments);
};
B.prototype.getName = function(){
return this.name;
};
var b = new B('hello');
console.log(b.getName()); //hello

Javascript设计模式学习一的更多相关文章

  1. JavaScript设计模式学习之路——面向对象的思想

    今天,我拿到了张容铭写的这本<JavaScript设计模式>这本书,开始了关于JavaScript更深一点的学习. 看到这本书开始的时候,虽然之前通过看书.一些比较好的视频的讲解,对Jav ...

  2. JavaScript设计模式学习笔记

    1 JavaScript设计模式深入分析 私有属性和方法:函数有作用域,在函数内用var 关键字声明的变量在外部无法访问,私有属性和方法本质就是你希望在对象外部无法访问的变量. 特权属性和方法:创建属 ...

  3. javascript设计模式学习之十二——享元模式

    一.享元模式的定义及使用场景 享元模式是为了解决性能问题而诞生的设计模式,这和大部分设计模式为了提高程序复用性的原因不太一样,如果系统中因为创建了大量类似对象而导致内存占用过高,享元模式就非常有用了. ...

  4. javascript设计模式学习之十七——程序设计原则与面向接口编程

    一.编程设计原则 1)单一职责原则(SRP): 这里的职责是指“引起变化的原因”:单一职责原则体现为:一个对象(方法)只做一件事. 事实上,未必要在任何时候都一成不变地遵守原则,实际开发中,因为种种原 ...

  5. javascript设计模式学习之十六——状态模式

    一.状态模式的定义 状态模式的关键是区分事务内部和外部的状态,事务内部状态改变往往会带来事务的行为改变. 状态模式中有意思的一点是,一般我们谈到封装,都是优先封装对象的行为,而非对象的状态.但在状态模 ...

  6. javascript设计模式学习之十三——职责链模式

    一.职责链的定义和使用场景 职责链模式的定义是,职责链模式将一系列可能会处理请求的对象连接成一条链,请求在这些对象之间一次传递,直到遇到一个可以处理它的对象.从而避免请求的发送者和接收者之间的耦合关系 ...

  7. javascript设计模式学习之十——组合模式

    一.组合模式定义及使用场景 组合模式将对象组合成树形结构,用以表示“部分—整体”的层次结构,除了用来表示树形结构之外,组合模式还可以利用对象的多态性表现,使得用户对单个对象和组合对象的使用具有一致性. ...

  8. javascript设计模式学习之九——命令模式

    一.命令模式使用场景及定义 命令模式常见的使用场景是:有时候需要向某些对象发送请求,但是并不知道请求的接受者是谁,也不知道请求的具体操作是什么.此时希望用一种松耦合的方式来设计程序,使得请求的发送者和 ...

  9. JavaScript设计模式学习之路——继承

    早在学习java的时候,就已经接触了继承,在java中因为有extends关键字,因此继承就比较简单.但是在JavaScript中,只能通过灵活的办法实现类的继承. 下面是我昨天在学习过程中,了解到的 ...

随机推荐

  1. Java的初始化块、静态初始化块、构造函数的执行顺序及用途探究

    Java与C++有一个不同之处在于,Java不但有构造函数,还有一个”初始化块“(Initialization Block)的概念.下面探究一下它的执行顺序与可能的用途. 执行顺序 首先定义A, B, ...

  2. Spring AspectJ基于注解的AOP实现

    对于AOP这种编程思想,很多框架都进行了实现.Spring就是其中之一,可以完成面向切面编程.然而,AspectJ也实现了AOP的功能,且实现方式更为简捷,使用更加方便,而且还支持注解式开发.所以,S ...

  3. javascript中的闭包

    闭包一直是javascript中的难点,也比较不容易被初学者所掌握,"官方"的解释是:所谓"闭包",指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是 ...

  4. docker学习(5) 在mac中创建mysql docker容器

    github上有一个专门的docker-libary项目,里面有各种各样常用的docker镜像,可以做为学习的示例,今天研究下其中mysql镜像的用法,国内镜像daocloud.io也能找到mysql ...

  5. [LeetCode] Intersection of Two Arrays 两个数组相交

    Given two arrays, write a function to compute their intersection. Example:Given nums1 = [1, 2, 2, 1] ...

  6. Zend Framework 项目 index.php 的问题

    默认生成的Zend项目在public目录下会自动生成一个.htaccess文件,这是用来实现伪静态,即隐藏index.php这个唯一入口文件的. 但是,搭建项目时遇到一个问题:URL中如果不加inde ...

  7. kubernetes 1.4.5集群部署

    2016/11/16 23:39:58 环境: centos7 [fu@centos server]$ uname -a Linux centos 3.10.0-327.el7.x86_64 #1 S ...

  8. Stream与byte[]与Image与string

    public byte[] GetByteImage(Image img) { byte[] bt = null; if (!img.Equals(null)) { using (MemoryStre ...

  9. iOS学习-UITextField设置placeholder的颜色

    UITextField *text = [[UITextField alloc] initWithFrame:CGRectMake(, , , )]; text.borderStyle = UITex ...

  10. h5手机端下拉选择城市

    <!doctype html><html>    <head>            <meta http-equiv="Content-Type& ...