js设计模式入门

设计模式其实就是以前别人写代码的一些套路

可以满足某一类的使用场景

优点:

  1. 可维护性好
  2. 便于沟通
    性能

缺点:

  1. 复杂性
  2. 性能

1. 对象

原始代码

function startAnimation() {
    console.log('start animation')
}
function stopAnimation() {
    console.log('stop animation')
}

改为面向对象的方式

var Anim = function() {
}
Anim.prototype.start = function() {
    console.log('start animation')
}
Anim.prototype.stop = function() {
    console.log('stop animation')
}
var myAnim = new Anim()
myAnim.start()
myAnim.stop()

变形简化

var Anim = function() {}
Anim.prototype = {
    start: function() {
        console.log('start')
    },
    stop: function() {
        console.llog('end')
    }
}

持续改进

Function.prototype.method = function(name, fn) {
    this.prototype[name] = fn
}
var Anim = function() {
}
Anim.method('start', function() {
    console.log('start animation')
})
Anim.method('stop', function() {
    console.log('stop animation')
})

持续改进,链式调用

Function.prototype.method = function(name, fn) {
    this.prototype[name] = fn
    return this
}
var Anim = function() {}
Anim.method('start', function() {
    console.log('start animation')
}).method('stop', function() {
    console.log(stop animation')
})

匿名函数

以下是立即执行的函数表达式

(function(){
    var foo = 1
    var bar = 2
    console.log(foo * bar)
})()

携带参数

(function(foo, bar){
   console.log(foo * bar)
})(1, 2)

var a = function(foo, bar){
   console.log(foo * bar)
}
a(1,2)

闭包,访问函数内部的局部变量

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

2.封装

JS对象没有私有属性

var Book = function() {
}
Book.prototype.setTitle = function(title) {
   if(!this.checkTitle(title)) return
   this.title = title
}
Book.prototype.checkTitle = function(title) {
   return title.length > 2 && title.length < 20
}
Book.prototype.display = function() {
   console.log('Book title is ' + this.title)
}
var myBook = new Book()
myBook.setTitle('设计模式')
myBook.display()
myBook.checkTitle('啊')  //不希望这个方法被外部调用,只希望被内部调用

myBook.title = 'Http深入浅出' //不希望直接修改这个属性

在使用上面的方法时, 调用者在调用时可能不会使用checkTitle去设置而是直接改变title的值

解决方法

形式上的“封装”
给不想暴露的方法命名加下划线,虽然本质上没什么用,但至少形式上便于理解

var Book = function() {
}
Book.prototype.setTitle = function(title) {
    if(!this._checkTitle(title)) return
    this.title = title
}
Book.prototype._checkTitle = function(title) {
    return title.length > 2 && title.length < 20
}
Book.prototype.display = function() {
    console.log('Book title is ' + this.title)
}

让需要隐藏的数据变为局部变量

var Book = function() {
    var title
    function checkTitle(title) {
        return title.length > 2 && title.length < 20
    }
    this.setTitle =  function(newTitle) {
        if(!checkTitle(newTitle)) return
        title = newTitle
    }
    this.display = function() {
        console.log('Book title is ' + title)
    }
}
Book.prototype.other = function() {}
var myBook = new Book()
myBook.setTitle('设计模式')
myBook.display()

静态方法和属性

更高级的写法

var Book = (function() {
    //私有的静态变量,只有一份
    var numOfBooks = 0
    //私有的静态方法,只有一份
    function checkTitle(title) {
        return title.length > 2 && title.length < 20
    }
    return function() {
        var title
        numOfBooks++
        if(numOfBooks > 10)  throw new Error('最多只能创建10本书')
        this.setTitle =  function(newTitle) {
            if(!checkTitle(newTitle)) return
            title = newTitle
        }
        this.display = function() {
            console.log('Book title is ' + title)
        }
    }
})()
//公开的静态方法
Book.convertToTitlecase = function(str) {}
//公开的实例方法
Book.prototype = {
    other: function(){}
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,159评论 1 32
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,881评论 2 9
  • 第一章 错误处理: 错误: 程序运行过程中,导致程序无法正常执行的现象(即bug) 现象: 程序一旦出错,默认会报...
    fastwe阅读 1,157评论 0 1
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,184评论 0 21
  • “多幸运在最美的年纪遇见你没有遗憾和可惜抱紧你用尽全部力气不让幸福逃离多幸运爱你这件事情成为我今生最对的决定我相信...
    浅忆fl阅读 127评论 1 2