1.设计模式(动态语言、多态、封装、原型模式)

1.动态语言与鸭子类型(js语言能轻松实现面向接口编程,而不是实现编程)

  1. 动态语言:编译的时候不关注数据类型,编译时没有类型检查的过程,运行的时候根据被赋予的数值来决定类型
    2)鸭子类型:只关注对象行为,不关注对象本身
  2. 因此js在实现多态的时候并不需要出现向上转型
代码示例
var duck = {
  singFun:function(){
    console.log("gagaga")
  }
}
var chicken = {
  singFun:function(){
    console.log("gagaga")
  }
}
var choir = [];
var joinChoir = function(animal){
  if(animal & typeof animal.singFun === 'function'){
    choir.push(animal);
  }
}
joinChoir(duck)
joinChoir(chicken) //无需关心鸡是否属于鸭子类型,只要有singFun行为就能加入合唱团

2.多态:将做什么 和 谁去做以及怎样做 分离开来, 将不变的事物 与 可能改变的事务分离

代码示例
function sound(animal){
  if(animal instanceof Duck){
    console.log("'gagaga")
  }else if(animal instanceof Chicken){
    console.log("zhizhizhi")
  }
}
sound(duck);
sound(chicken)
//分析:叫是不变的行为,可变的是 谁去叫以及怎样叫,倘若来一只狗,上面的代码则还要加入一个判断狗,下面为优化
function sound(animal){
  animal.sound()
}
var chicken = {
  sound:function(){
  console.log("zhizhizhi")
  }
}
var chicken = {
  sound:function(){
  console.log("gagaga")
  }
}
sound(chicken)
sound(duck)

3.封装:封装的目的是将信息隐藏
1)封装数据:在许多语言的对象系统中,封装数据是由语法解析来实现的,这些语言也许提供了private、public、protected等关键字来提供不同的访问权限(js没有,依赖变量作用域来实现封装的特性并且只能模拟public和private两种封装特性)

代码实现
//除了let
var obj = (function(){
  var _name = "hahaha";
  return{
    getName : function(){
      return _name
    }
  } 
})()

4.原型模式(在以类为中心的面向对象编程语言中,类和对象的关系可以想象成铸模和铸件的关系,对象总是从类中创建而来,而在原型编程思想中,类并不是必须的,对象未必需要从类中创建而来,一个对象是通过克隆另外一个对象得到的)

代码实现
//如果A对象是从B对象克隆而来,那么B对象则是A对象的原型,则从A到B形成了一条原型链,当我们在A 中找不到这个方法的时候就会把这个请求委托给B,这样一来便实现了继承的效果
var p =  {
  name:"hahaha"
}
var p1 = Object.create(p)
p1.__proto__ === p

var a1 = new Object();
var a2 = {};
console.log(a1.__proto__  === Object.prototype,a1.__proto__  === Object.prototype)  //true
//总结:所有的数据都是对象,要得到一个对象不是通过实例化类,而是找到一个对象作为原型并克隆它

你可能感兴趣的:(1.设计模式(动态语言、多态、封装、原型模式))