设计模式 面向对象(1)

190 阅读2分钟

1、学习内容概述

image.png

2、面向对象 ?

1、搭建开发环境

image.png

1、新建空文件夹 
2、npm 初始化 npm init -y 
3、新建一个 src文件夹 创建一个 index.js
4、安装 yarn add webpack webpack-cli --save-dev

    
5、简单配置一下 webpack 
module.exports = {
  entry: "./src/index.js", // 入口
  output: {
    path: __dirname, //当前文件
    filename: "./release/bundle.js", //打包后文件夹和文件
  },
};


6、scripts 需要配置一个 dev 指向刚才创建的config文件 
 "dev": "webpack --config ./webpack.dev.config.js --mode development"

7、执行 打包成功 这个 应该是最简单的webpack打包过程

image.png

image.png

8、安装 yarn add webpack-dev-server html-webpack-plugin --save-dev
9、根目录下新建 index.js  随意写一点内容就行
10、修改 dev-config文件 
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");

module.exports = {
  entry: "./src/index.js", // 入口
  output: {
    path: __dirname, //当前文件
    filename: "./release/bundle.js", //打包后文件夹和文件
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: "./index.html",
    }),
  ],
  devServer: {
    contentBase: path.join(__dirname, "./release"), //根目录下的release文件夹 打包后的文件
    open: true, //打开浏览器
    port: 9000,
  },
};

11、更改配置文件 使用 dev-server 
"dev": "webpack-dev-server --config ./webpack.dev.config.js --mode development"
12、执行 yarn dev
  • 执行 上面那个报错

image.png

  • 查看官网 更改为 下面 static 那种表达即可
  devServer: {
    // contentBase: path.join(__dirname, "./release"), //根目录下的release文件夹 打包后的文件
    static: {
      directory: path.join(__dirname, "./release"),
    },
    open: true, //打开浏览器
    port: 9000,
  },
  • 然后 yarn dev

image.png

  • 非常nice

  • 当更改 index.js 100--> 200 页面也会同步刷新

image.png

image.png

3、使用 babel 解析 es6

1、安装一堆插件

      yarn add babel-core babel-loader babel-polyfill babel-preset-es2015 babel-preset-latest --save-dev

2、创建 .babelrc

image.png

  • 添加 module image.png

image.png

image.png

  • 执行 后 查看

image.png

image.png

image.png

  • 到此处 环境 ok es6处理也ok了

3、面向对象 ?

image.png

* class类(模版) 和 对象(new实例化出的实例 可有很多)

    class Person {
      constructor(name, age) {
        (this.name = name), (this.age = age);
      }

      eat() {
        console.log(`${this.name} eat some `);
      }

      speak() {
        console.log(`${this.name} has ${this.age} years old`);
      }
    }

    var xiaowang = new Person("jack", 18);
    xiaowang.eat();
    xiaowang.speak();
  • 三要素

image.png

1、继承

  • 继承的例子 重点在于constructor 和 super
  • 继承 实际例子 xxx 组件 extends React.Component {} 继承自react 组件
    class Person {
      constructor(name, age) {
        (this.name = name), (this.age = age);
      }

      eat() {
        console.log(`${this.name} eat some `);
      }

      speak() {
        console.log(`${this.name} has ${this.age} years old`);
      }
    }

    class Student extends Person {
      constructor(name, age, number) {
        super(name, age);
        this.number = number;
      }

      study() {
        console.log(`${this.name} like study`);
      }

      speak() {
        console.log(`${this.name} also like speak`);
      }
    }

    var xiaoqiang = new Student("xiaojia", 18, "A6");
    xiaoqiang.study(); // xiaojia like study
    xiaoqiang.speak(); // xiaojia like study
  • 需要注意的部分

image.png

2、封装

image.png

image.png

image.png

  • 这个在 ts 中有效

  • 可以在这个 网站 运行 ts

www.typescriptlang.org/zh/play?#co…

       class Person {
        name
        age
        protected weight
        private dog
      constructor(name, age, weight,dog) {
        this.name = name, this.age = age , this.weight = 120 , this.dog = 'ppx'
      }

      eat() {
        console.log(`${this.name} eat some `);
      }

      speak() {
        console.log(`${this.name} has ${this.age} years old`);
      }
    }

    class Student extends Person {
        number
        private friend
      constructor(name, age,weight, number, friend) {
        super(name, age,weight,dog);
        this.number = number
        this.friend = friend
      }

      study() {
        console.log(`${this.name} like study`);
      }

      speak() {
        console.log(`${this.name} also like speak`);
      }

      getWeight(){
          console.log(`get ok of ${this.weight}`)
      }

      getFriend(){
          console.log(`${this.friend}`)
      }

      getDog(){
          console.log(`${this.dog}`)
      }
    }

    var xiaoqiang = new Student("xiaojia", 18, 120,'A6', 'xiaoli');
    xiaoqiang.study(); // xiaojia like study
    xiaoqiang.speak(); // xiaojia like study
    xiaoqiang.getWeight()
    xiaoqiang.getFriend()
    xiaoqiang.getDog()

3、多态

  • 定义 同一个 接口 在子类中可实现不同的功能

  • 代码 示例

    class People {
      constructor(name) {
        this.name = name;
      }

      sayName() {
        console.log(this.name);
      }
    }

    // 都继承自People 但实例化后表现结果不一样
    let a = new People("a");
    a.sayName(); // a

    let b = new People("b");
    b.sayName(); // b

image.png

4、面向对象 实际案例 ?

image.png

image.png

*代码 演示一下

  • 非常 nice 下面代码 起码学会了 2间事情

     1、面向对象在 jQuery 怎么应用的 ?
     2、如何实现 jQuery的思路 ? 
     3、jQuery 就是一个类  ?
    
 <body>
    <p>啦啦啦-1</p>
    <p>啦啦啦-2</p>
    <p>啦啦啦-3</p>
  </body>
  <script>
    class jQuery {
      constructor(selector) {
        let slice = Array.prototype.slice;
        let dom = slice.call(document.querySelectorAll(selector)); // 拿到dom 并slice.call()转为 对象
        let len = dom ? dom.length : 0;
        for (let i = 0; i < len; i++) {
          this[i] = dom[i];
        }
        this.length = len;
        this.selector = selector || "";
      }

      append(node) {}
      addClass(name) {}
      html(data) {}

      // 省略更多 API
    }
    
    // 实例化 
    window.$ = function (selector) {
      return new jQuery(selector);
    };

    // test
    var $p = $("p");
    console.log($p); // jQuery {0: p, 1: p, 2: p, length: 3, selector: "p"}
    console.log($p.append); // ƒ append(node) {}
  </script>

5、为何使用 面向对象 ?

image.png

6、UML 类图 ?

image.png

image.png

image.png

  • 动手试试

image.png

image.png

7、UML 类图 关系图(多个继承/关联关系) ?

  • 演示代码
 class Person {
      constructor(name, age,house) {
        (this.name = name), (this.age = age),this.house = house;
      }

      saySomething(){}
    }

    class StudentA extends Person {
      constructor(name,houser) {
        super(name, house);
      }

      saySomething(){console.log('I am A ')}
    }

    class StudentB extends Person {
      constructor(name,house) {
        super(name, house);
      }

      saySomething(){console.log('I am B ')}
    }

    class House{
        constructor(city){
            this.city = city
        }
        showCity(){
            console.log(`${city}`)
        }
    }
  • UML 类图 展示

image.png

8、总结 ?

1、开发前 画出 UML 类图 展示