HuangHongRui / huanghongrui.github.io

:poultry_leg: MyBlog | Keep track of every moment.. :icecream:
http://blog.luckyman.xyz/
3 stars 1 forks source link

设计模式 #12

Open HuangHongRui opened 6 years ago

HuangHongRui commented 6 years ago
  1. 工厂模式 该模式抽象了创建具体对象的过程。 考虑到在Js中无法创建类,程序猿发明该种函数,用来封装以特定接口创建对象的细节。 解决: 多个相似对象的问题。 缺点: 没有解决对象识别(对象类型)的问题
    function createObj(name, age, job){
    let rui = new Object();
    rui.name = name;
    rui.age = age;
    rui.job = job;
    rui.sayName = function(){
        return this.name
    };
    return rui;
    }
    var rui1 = createObj('rui1', 24, 'it')
    var rui2 = createObj('rui2', 24, 'it')
HuangHongRui commented 6 years ago
  1. 构造函数模式 对比工厂模式:
    • 无显式地创建对象
    • 直接将属性和方法付给 this 对象
    • 无 return 语句 注意点:
    • 始终以一个大写字母开头。
    • 创建构造函数的实例,必须使用·new·操作符。 缺点:
    • 每个方法都要在每个实例上重新创建一遍。 解决方法:
    • 将方法(函数)的定义单独放到构造函数外部,在构造函数内部引用外部该方法。【无封装可言】
      function Person(name, age, job){
      this.name = name;
      this.age = age;
      this.job = job;
      this.sayName = function(){
      alert(this.name)
      }
      }
      new Person( 'Rui', 22, 'Web')
HuangHongRui commented 6 years ago
  1. 原型模式

创建每一个函数都均有一个 原型属性(prototype),属于指针,指向一个对象。 而这个对象 用途 是 通过调用构造函数所得到的实例 的原型对象。 原型对象好处是:可让所有对象实例共享它的 属性与方法。

可以看成是一个总仓库,实例认为是每一个箱子,如果箱子里无该属性和方法,那么就到总仓库找。

缺点:

  1. 省略构造函数参数
  2. 共享属性——引用类型
HuangHongRui commented 6 years ago

自定义类型 最常见方式——最佳配合

构造函数+原型模式(混杂模式)

构造函数:用于定义 实例属性。 原型函数:定义方法和共享属性。

其结果: 实例均拥有专属实例属性和共享原型引用——节省内存

并且支持 传参。

function Gz(name, age){
    this.name = name;
    this.age = age;
    this.friends = ['a','b']; //引用类型数组的话,设置为实例属性不会导致混乱
}
Gz.prototype = {
    constructor : Gz, //使用对象字面量定义属性,constructor会默认定义到Object,需要的话可手动定义回Gz构造函数
    sayName : function() {
        console.log(this.name)
    }
}
Rui = new Gz('Rui',100)