JavaScript设计模式笔记记录

1、instanceof  用来判断一个构造函数的prototype属性所指向的对象是否存在在另外一个要检测对象的原型链
  • instanceof的普通的用法,obj instanceof Object 检测Object.prototype是否存在于参数obj的原型链上。

  • 继承中判断实例是否属于它的父类

第一章、

    1.2.1 多态
            一段多态js代码
let makeSound = function(animal){
    if(animal instanceof Duck){
        console.log('嘎嘎嘎')
    }else if(animal instalceof Chicken){
        console.log('咯咯咯')
    }
}
let Duck = function(){}
let Chicken = function(){}
makeSound(new Duck())  // 嘎嘎嘎
makeSound(new Chicken())  // 咯咯咯
            

        这段代码确实体现了“多态性”,当我们分别向鸭和鸡发出“叫唤”的消息时,它们根据此
消息作出了各自不同的反应。但这样的“多态性”是无法令人满意的,如果后来又增加了一只动
物,比如狗,显然狗的叫声是“汪汪汪”,此时我们必须得改动 makeSound 函数,才能让狗也发出
叫声。修改代码总是危险的,修改的地方越多,程序出错的可能性就越大,而且当动物的种类越
来越多时, makeSound 有可能变成一个巨大的函数。
        多态背后的思想是将“做什么”和“谁去做以及怎样去做”分离开来,也就是将“不变的事
物”与 “可能改变的事物”分离开来。在这个故事中,动物都会叫,这是不变的,但是不同类
型的动物具体怎么叫是可变的。把不变的部分隔离出来,把可变的部分封装起来,这给予了我们
扩展程序的能力,程序看起来是可生长的,也是符合开放—封闭原则的,相对于修改代码来说,
仅仅增加代码就能完成同样的功能,这显然优雅和安全得多
1.2.2 对象的多态性
    首先把不变的部分隔离出来,=》所有的动物都会发出叫声
    
let makeSound = function(animal){
    animal.sound()
}
        然后把可变的部分各自封装起来,多态性实际上指对象的多态性
let Duck = function(){}
Duck.prototype.sound = function(){
    console.log('嘎嘎嘎')
}
let Chicken = function(){}
Chicken.prototype.sound = function(){
    console.log('咯咯咯')
}
    调用
makeSound(new Duck())
makeSOund(new Chicken())
        鸭和鸡都发出‘叫’的消息,接到消息后分别作了不同的反应。
        增加一只狗,只要追加就行了
let Dog = function(){}
Dog.prototype.sound = function(){
    console.log('汪汪汪')
}
makeSound(new Dog())
    
1.2.3 类型检查和多态
    类型检查是在表现出对象多态性之前的一个绕不开的话题,但 JavaScript 是一门不必进行类
型检查的动态类型语言,为了真正了解多态的目的,我们需要转一个弯,从一门静态类型语言说起。
    
静态语言在编译时会进行类型匹配检查,例如JAVA:在代码编译时进行严格的类型检查,不能给变量赋不同类型的值
String str
str = 'abc'
str = 2//报错


一个多态思路:多个地图通过调用一个方法实现



let googleMap = {
    show(){
        console.log('谷歌地图')
    }
}
let baiduMap = {
    show(){
        console.log('百度地图')
    }
}
let renderMap = function(map){
    if(map.show instanceof Function){
        map.show()        
    }
}
renderMap(googleMap)
1.4原型模式

1.4.1 使用克隆的原型模式
       从设计模式的角度讲,原型模式是用于创建对象的一种模式,如果我们想要创建一个对象,一种方法是先指定它的类型,然后通过类来创建这个对象。 原型模式选择了另外一种方式,我们不再关心对象的具体类型,而是找到一个对象,然后通过克隆来创建一个一模一样的对象。

      既然原型模式是通过克隆来创建对象的,那么很自然想到, 如果需要一个跟某个对象一模一样的对象,就可以使用原型模式
    
例子:飞机大战游戏,如果某种飞机拥有分身技能,使用技能时,要在页面创建跟他一模一样的飞机,包括血量什么的。
let Plane = function(){
    this.blood = 100;
    this.attackLevel = 1;
    this.defenseLevel = 1;
}
var plane = new Plane()
plane.blood = 500;
plane.attackLevel = 10
plane.defenseLevel = 7;
let clonePlane = Object.create(plane)
console.log(clonePlane) //输出Object{blood:500,attackLevel:10,defenseLevel:7}

    在不支持Object.create方法的浏览器中,可以使用下面的代码
Object.create = Object.create || function(obj){
    let F = function(){}
    F.prototype = obj
    reutrn new F()
}

1.4.2 克隆是创建对象的手段
    

Object.getPrototypeOf( a ) =》
用于读取一个对象的 prototype 对象。


1.4.6 ES6带来的Class语法
class Animal {
    constructor(name) {
    this.name = name;
    }
getName() {
    return this.name;
    }
}
class Dog extends Animal {
    constructor(name) {
    super(name);
}
speak() {
    return "woof";
    }
}
let dog = new Dog('Scamp')
console.log(dog.getName()+'say'+dog.speak())//Scampsaywoof

你可能感兴趣的:(技术笔记)