面向对象 设计模式

184 阅读4分钟

面向对象

     面向对象:是一种编程思想;  先不做东西,分析东西怎么构成的,抽象成几个部分或者步骤 分由不同的人负责不同的部分,各自完成,然后组装  会考             虑复用的问题,把能用的东西留下来,便于下次用,像是把函数包装一下,在很多地方可以去调用
        OOP:面向对象的英文
        高内聚  低耦合 就是面向对象的一种方法;高内聚:把实现功能的东西能放在一起,低耦合就是各个模块之间的关联越少
        java  c++  php python
    面向过程:也是一种编程思想;  就是一点点一步步的做,没有分为几个部分 全程一个人去做,做完一个再做下一个 不考虑复用的问题
        C

        面向对象:类的继承  封装 多态
        
         JS中的内置类 :自带的类:Array(数组类)  String(字符串类)  Number(数字类)  Boolean(布尔类) Object(对象类) NodeList  Function(函数类)
                            [1]             '12'             1                true           {}                      f(){}
    
var ary = [1];//字面量的方式创建的数组类的实例
var ary2 = new Array('1','1');//构造函数的方式创建的数组类的实例;   这两种创建方式没有区别
var ary3 = new Array(10);//如果参数只有一个,并且是数字的时候,这个数字代表这个数组的长度
console.log(ary,ary2,ary3);

//new 创造出来的东西都是引用数据类型
var str = '';
var str2 = new String();
console.log(str == str2);//true
console.log(str === str2);//false  这里的str2的数据类型变成了object

设计模式

几种常见的设计模式:
        单例模式:单个的实例;就是一个对象,可以避免命名冲突的问题;这个对象名我们也称为命名空间;一般使用单例可以用来封装一些工具函数 库
        工厂模式:
        构造函数模式
        原型模式
        
    高级单例模式:也是一个对象,只是是由一个函数返回的一个单例(闭包),使别人不能轻易获取里面的内容,一般也是在模块化开发里使用
    
    //高级单例
    function fn () {
    var name = 'zhufeng';
    var age = 12;
    function init () {
        console.log(name,age);
    }
    return {
        init
    }
    }
    var obj = fn ();//{init}

    工厂模式:就是一个函数;然后返回一个单例;批量产生单例。与高级单例模式的区别是高级单例模式一般没有传参数
    
    //单例模式的对象可以变成下面的函数,这样,只用输出参数,可以批量产生单例
    function factory (name,age,sex) {
    var obj = {
        name,sex,age,
        eat(){},
        play(){},
    }
    return obj
    }
    var per1 = factory('xiaoming',12,1)
    
    function factory (name,age=12,sex = 1,cb) {//这种es6最新的默认赋值方式,只有在传入的实参是undefined的时候才走默认值
    name = name || '1'//这是es5的时候给默认值的方式
    cb && cb();//cb回调函数, 如果没有传回调函数就不执行,传了才执行  es5的时候
    var obj = {
        name,sex,age,
        eat(){},
        play(){},
    }
    return obj
    }

    构造函数模式:一般用来造一些插件  缺点:有些公用的东西没办法去公用
    
    function Person (name,age,sex) {
    this.name = name;
    this.age = age;
    this.eat = function(){};
    this.play = function(){};
    return {
        1:1,
        name
    }
    }
    var per2 = Person('zf',12,1);
    var per22 = new Person('zf',12,1); //这里Person是一个类,per22是Person的一个实例
    console.log(per22);//是Person的一个实例 
    //new执行函数的时候,函数内部的this都是指向了一个堆内存,函数执行完成之后,又把this返出去,默认返回值是this
    //若写了返回值,但是是个值类型,那么默认返回仍然是this
    //若返回值是个引用数据类型,那么返回值就默认是这个引用数据类型

    //es6的箭头函数不能通过new的方式执行的
    //es6 创造类的方式 是通过 class创造的
    //  var FN2 = ()=>{
    //      this.name = 123;
    //  }
    //  console.log(new FN2);//报错

    class FN3{
     constructor(name,age){  //constructor这个词是写死的词,不能换
        this.name = name;
        this.age = age;
     }
    }
    var f3 = new FN3('xiaoming',122);

原型模式:在构造函数的基础上加了一个原型(prototype) 的概念  优点是 公用 省空间
    function Person (name='zf',age=10,sex=1){
   this.name = name;
   this.age = age;
   this.sex = sex;
    }
    console.log(Person.prototype);//prototype是Person这个的原型 
   //在原型上放的属性都是这个类公用的属性    
   Person.prototype.eat = function(){
       console.log('吃')
   }
   Person.prototype.play = function(){
       console.log('玩')
   }
   var p1 = new Person();
   var p2 = new Person();
   console.log(p1,p2);//这时,p1和p2的eat和play可以调用,但是不占用它自己的堆内存  
   //查找属性时,先在自己身上查,没有就去原型上查
   p1.eat = function () {
       console.log('吃')
   };//这时就给p1自己加了一个eat属性

   //es6的原型怎么写?
   class FN {  //class声明的东西,类,只能通过new 方式执行;
   constructor(name,age){
    this.name = name;
    this.age = age;
   }//这里constructor其实就相当于上面的函数体
   //下面的就相当于prototype 部分,而且格式必须是简写格式,如下,而且添加的原型属性必须是个函数,不能是别的类型
   eat(){

   }
   play(){

   }
   }
   var f = new FN;
   console.log(f);