# 面向对象的javascript

# 动态类型语言(dark typing)

编程语言大致可分静态语言动态语言。JavaScript是动态与语言,不必需要借助超类就能实现“面向接口编程,而不是面向实现编程”,例如:对象含有pushpop方法就能当使用;对象有length(slice和splice)就能当数组使用。

# 多态

  • 定义:同一操作 作用于不同对象,产生不同的效果。
  • 思想:做什么,谁去做 分开
  • 作用:可减少条件分支语句
  • 类型检查:静态语言会类型检查,所以需要通过继承来解决。
public class Chicken{
    public void makeSound(){
        System.out.printIn('咯咯咯');
    }
}

public class Dark{
    public void makeSound(){
        System.out.printIn('嘎嘎嘎');
    }
}

public class AnimalSound{
    public void makeSound(Dark dark){
        dark.makeSound();
    }
}

public class Test{
    public static void mind(String args[]){
        AnimalSound animalSond = new AnimaSound();
        Dark dark = new Dark();
        animalSond.makeSound(dark); // 嘎嘎嘎
        Chicken chicken = new Chicken();
        animalSond.makeSound(chicken); // 报错
    } 
}

// 使用继承得到多态效果,解决类型检查问题

public abstract class Animal{
    abstract makeSound();       // 抽象方法
}


public class Dark extends Animal{
    public void makeSound(){
        System.out.printIn('嘎嘎嘎');
    }
}

public class Chicken extends Animal{
    public void makeSound(){
        System.out.printIn('咯咯咯');
    }
}

Animal dark = new Dark();
Animal chicken = new chicken()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

# Javascript 的多态

JavaScript不存在类型检查,只取决于对象上是否有makeSound方法。不存在“类型耦合”

# 多态与设计模式

  • 命令模式
  • 组合模式
  • 策略模式

# 封装

  • 目的:隐藏信息(数据,实现细节,设计细节,对象类型等)

# 封装与设计模式

  • 创建型:封装创建对象的变化
  • 结构型:封装对象间的组合关系
  • 行为型:封装对象的行为变化

# 继承-原型模式(第一个设计模式)

JavaScript的继承基于原型继承。原型模式是设计模式也是编程泛型。

原型模式的关键是语言本身是否提供了clone方法。ES5 提供了Object.create方法。

var Plan = function(){
    this.a = 4  
} 
var plan = new Plan()

p
1
2
3
4
5
6

javascript的对象未必是创建而来,可以克隆。