当前位置: 首页 > news >正文

前端设计模式(0)面向对象设计原则

设计模式清单

没有链接的是还没有写的,计划要写的,欢迎阅读交流~
前端设计模式(0)面向对象&&设计原则
前端设计模式(1)--工厂模式
前端设计模式(2)--单例模式
前端设计模式(3)--适配器模式
前端设计模式(4)--装饰器模式
前端设计模式(5)--代理模式
前端设计模式(6)--外观模式&&观察者模式
前端设计模式(7)--状态和策略模式
前端设计模式(8)--原型模式
...

什么是面向对象

把客观对象抽象成属性数据和对数据的相关操作,把内部细节和不想关的信息隐藏起来,把同一个类型的客观对象的属性数据和操作绑定在一起,封装成类,并且允许分成不同层次进行抽象,通过继承实现属性和操作的共享,来,前端设计模式我们从面向对象开始。

  • 面向对象的分析 OOA
  • 面向对象的设计 OOD
  • 面向对象的编程 OOP

继承

/**
 * 类 对象(实例)
 * 父类Animal是公共的
 */
class Animal {
  constructor (name) {
    this.name = name
  }
  eat () {
    console.log(`${this.name}eat`)
  }
}
let animal = new Animal('动物')
animal.eat()


/**
 * 继承
 * 子类继承父类
 * 继承可以把公共的方法抽离出来,提高复用,减少冗余
 */
class Animal {
  constructor (name) {
    this.name = name
  }
  eat () {
    console.log(`${this.name}eat`)
  }
}

class Cat extends Animal {
  constructor (myname, age) {
    super(myname)
    this.age = age
  }
  speak () {
    console.log(`${this.name}:喵喵~`)
  }
}
let cat = new Cat('小花猫', 0)
cat.eat () 
cat.speak () 
复制代码

封装

这里说明一下, 把数据封装起来 减少耦合,不该外部访问的不要让外部访问 利于数据的接口权限管理 ES6 目前不支持,一般认为_开头的都会私有的,不要使用,后面讲的会使用ts,有不了解的童鞋可以去官网看看,2分钟入门

class Animal2 {
  public name  // 公共的,类内或者类外都可以访问,比如:你的名字谁都可以知道
  protected age // 收保护的自己和自己的子类可以访问,比如:女性的年龄
  private monney // 只有自己可以知道哦,私房钱嘛
  constructor (name, age, monney) {
    this.name = name
    this.age = age
    this.monney = monney
  }
}
class Person2 extends Animal2 {
  private card;
  constructor(name,age,monney,card) {
      super(name, age, monney)
      this.card=card;
  }
  getName() {
      console.log(this.name);
  }
  getAge() {
      console.log(this.age);
  }
  getWeight() {
      console.log(this.monney); // [ts] 属性“monney”为私有属性,只能在类“Animal2”中
  }
}
let person = new Person2('dafei', 18, '100000', '金卡')
复制代码

多态

同一个接口可以不同实现

保持子类的开放性和灵活性

面向接口编程

class Animal {
    public name;
    protected age;
    private weight;
    constructor(name,age,weight) {
        this.name=name;
        this.age=age;
        this.weight=weight;
    }
}
class Person extends Animal {
    private money;
    constructor(name,age,weight,money) {
        super(name,age,weight);
        this.money=money;
    }
    speak() {
        console.log('你好!');
    }    
}
class Dog extends Animal {
    private money;
    constructor(name,age,weight) {
        super(name,age,weight);
    }
    speak() {
        console.log('汪汪汪!');
    }    
}

let p=new Person('dafei',10,10,10);
p.speak();
let d=new Dog('dafei',10,10);
d.speak();
复制代码

设计原则

单一职责原则

  • Single responsibility principle
  • 一个程序只做好一件事
  • 如果功能特别复杂就进行拆分

开放封闭原则

  • Open Closed Principle
  • 对扩展开放,对修改关闭
  • 增加需求时,扩展新代码,而非修改已有代码
  • 这是软件设计的终极目标
function parseJSON(response) {
  return response.json();
}

function checkStatus(response) {
  if (response.status >= 200 && response.status < 300) {
    return response;
  }

  const error = new Error(response.statusText);
  error.response = response;
  throw error;
}


export default function request(url, options) {
  return fetch(url, options)
    .then(checkStatus)
    .then(parseJSON)
    .then(data=>{data})
    .catch(err => ({ err }));
}
复制代码

单一职责原则

  • Single responsibility principle
  • 一个程序只做好一件事
  • 如果功能特别复杂就进行拆分

其它原则

还有L 里氏替换原则、I 接口隔离原则、D 依赖倒置原则,JS使用比较少。

下一遍我们开始来一起学习,工厂模式

转载于:https://juejin.im/post/5c1496f4f265da611b583e2c

相关文章:

  • 专访Connolly:为什么我们需要手动回归测试宣言?
  • jedis连接服务超时connect timed out
  • 可以用parseInt()向下取整和Math.floor()有一样的功能
  • node和express搭建代理服务器(源码)
  • 解决Android8.0之后开启service时报错IllegalStateException: Not allowed to start service Intent ......
  • 技术篇-HBase 最佳实践-读性能优化策略
  • IaaS,PaaS和SaaS,又衍生出CaaS,NaaS和MaaS
  • Spring Cloud 下线微服务
  • 让UITableView的Cell都变成静态的
  • 牛客练习赛37
  • 『原创』设置SQL Server 2005自动备份——数据库邮件设置(图文)
  • Gmail工具和插件网址大全
  • 北京城市生态系统研究站取得2011年国自然科学基金重点基金资助
  • samba 文件共享
  • Nginx的介绍
  • 深入了解以太坊
  • .pyc 想到的一些问题
  • 【mysql】环境安装、服务启动、密码设置
  • Android Volley源码解析
  • CentOS7 安装JDK
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • laravel with 查询列表限制条数
  • log4j2输出到kafka
  • python_bomb----数据类型总结
  • React+TypeScript入门
  • SpingCloudBus整合RabbitMQ
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • vue总结
  • 从重复到重用
  • 最简单的无缝轮播
  • ![CDATA[ ]] 是什么东东
  • #1015 : KMP算法
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (Note)C++中的继承方式
  • (二)构建dubbo分布式平台-平台功能导图
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (算法)前K大的和
  • (五)MySQL的备份及恢复
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)关于pipe()的详细解析
  • **python多态
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • @ResponseBody
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [16/N]论得趣
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...
  • [ai笔记9] openAI Sora技术文档引用文献汇总