前端之JS常用设计模式

设计模式前言

设计模式(Design pattern)是一套被反复使用、思想成熟、经过分类和无数实战设计经验的总结的。使用设计模式是为了让系统代码可重用、可扩展、可解耦、更容易被人理解且能保证代码可靠性。设计模式使代码开发真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。只有夯实地基搭好结构,才能盖好坚壮的大楼。也是我们迈向高级开发人员必经的一步

设计原则

在这里插入图片描述
模式
解释
过程
写法

一、构造器模式

在面向对象编程中,新建的对象分配到内存后,有构造器函数初始化该对象。
过程:
1.创建对象并分配内存;
2.接收参数,通过构造器给对象赋值(属性和方法)。

1. 创建对象的三种方式

      // 1.创建对象(的三种方式)
      // ①
      var newObj = {};
      console.log(newObj);
      
      // ②
      var newObj = Object.create(null);
      console.log(newObj);

      // ③
      var newObj = new Object();
      console.log(newObj);
      // 注:使用 var 关键字声明的变量可以重复声明,后者会覆盖前者

在这里插入图片描述

2. 赋值的四种方式

      // 2.四种赋值方式
      // ①“点号”法
      // 设置name属性和属性值  对象.key = value
      newObj.name = "龙傲天";
      // 取值
      var name = newObj.name;
      console.log(name);

      // ② “方括号”法
      // 赋值取值
      newObj["age"] = 18;
      var age = newObj["age"];
      console.log(age);

      // ③Object.defineProperty方式
      // Object.defineProperty(对象,key,{ descriptor }) 在对象上添加新属性并赋值, 或修改对象已有属性
      Object.defineProperty(newObj, "sex", {
        value: "女",
        writable: true, //value值可改
        // enumerable: true,
        // configurable: true,
      });
      newObj.sex = "男";
      console.log(newObj.sex);

      // 等价于
      var defineProp = function (obj, key, value) {
        let config = {};
        config.value = value;
        Object.defineProperty(obj, key, config);
      };
      // 调用
      defineProp(newObj, "height", 175);
      console.log(newObj.height);

      // ④Object.defineProperties方式
      Object.defineProperties(newObj, {
        weight: {
          value: 55,
          writable: true,
        },
        eyesight: {
          value: 5.0,
          writable: true,
        },
      });

      console.log(newObj.weight);
      console.log(newObj["eyesight"]);

Object.defineProperty()函数详解

3. 构造器的两种写法

1.基础写法(对象的函数写在内部)

      //  构造函数写法一
      function Person(name, age, sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
        // 对象方法写在构造器内
        this.toString = function () {
          return (
            `我是` +
            this.name +
            `,今年` +
            this.age +
            `岁了,是一名` +
            this.sex +
            `生.`
          );
        };
      }
      var kunpeng = new Person("鲲鹏", 18, "男");
      console.log(kunpeng.toString());

在这里插入图片描述

2.使用"原型"的构造器(对象的函数写在prototype上, 可以被子类继承)√

      // 构造函数写法二: 原型写法
      function Person(name, age, sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
      }
      // 对象属性写在构造器内,方法(函数)写在原型上
      Person.prototype.toString = function () {
        return (
          `我是` +
          this.name +
          `,今年` +
          this.age +
          `岁了,是一名` +
          this.sex +
          `生.`
        );
      };

      var fenghuang = new Person("凤凰", 18, "女");
      console.log(fenghuang.toString());

在这里插入图片描述

4.补充

类的继承

二.装饰器模式

对原有功能进行拓展时, 在不违反’开放封闭原则’的情况下就可以用装饰器模式

      var old = function () {
        console.log("看不懂的一堆老逻辑");
      };
      //要求: 添加一些新逻辑
      var _old = old;
      var old = function () {
        _old();
        console.log("添加的新逻辑");
      };
      old();

在这里插入图片描述

三. 工厂模式

将创建对象的过程单独封装.

1.简单工厂模式

简单工厂模式是一个工厂对象来创建某一类产品的实例。
就是这个工厂只生产某一类产品, 比如不同的书.

以书为类

      function bookShop(name, year, vs, price) {
        var book = new Object();
        book.name = name;
        book.year = year;
        book.vs = vs;
        book.price = price;
        return book;
      }
      var b1 = bookShop("十万个为什么", 1999, "第三版", 123);
      var b2 = bookShop("神兵小将", 1999, "第二版", 23);
      console.log(b1, b2);

在这里插入图片描述

2.工厂方法模式

工厂方法模式就是对类的抽象,
就是说这个工厂生产多个种类的产品.
工厂方法模式关键核心代码就是工厂里面的判断this是否属于工厂(我能不能做)

以书的种类为类


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值