JavaScript 设计模式----学习基础(面向对象)
-
- 1. 设计模式导读
-
-
- 1.1 如何成为一名合格工程师
- 1.2 论工程师的设计能力
- 1.3 前端学习设计模式的困惑
- 2. 面向对象
-
-
- 2.1 搭建开发环境
-
-
- 2.1.1 初始化 npm 环境
- 2.1.2 安装配置 webpack
- 2.1.3 安装 webpack-dev-server
- 2.1.4 安装 babel
- 2.2 什么是面向对象
-
- 2.3 面向对象--继承
-
- 2.4 面向对象--封装
-
- 2.5 面向对象--多态
-
- 2.6 JS 应用举例
- 2.7 面向对象的意义
-
- 3. UML 类图
-
1. 设计模式导读
1.1 如何成为一名合格工程师
- 无论前端开发、客户端开发、后端开发都要学设计模式
只懂代码
,不懂设计
,很难成为一名高级工程师
1.2 论工程师的设计能力
前端开发有一定的设计能力
- 3 年工作经验,面试必考设计能力
- 成为项目技术负责人,设计能力是必要基础
- 从写好代码,到做好设计,设计模式是必经之路
1.3 前端学习设计模式的困惑
- 网上资料都是针对 Java 等后端语言的
- 看懂概念,但是不知道怎么用,看完就忘
- 现在的JS框架,到底都用了哪些设计模式
2. 面向对象
2.1 搭建开发环境
2.1.1 初始化 npm 环境
2.1.2 安装配置 webpack
安装
npm install web pack webpack-cli --save-dev
推荐淘宝镜像
npm install web pack webpack-cli --save-dev --registry=https://registry.npm.taobao.org
配置 webpack.dev.config.js
module.exports = {
entry: './src/index.js',
output: {
path:__dirname,
filename: './release/bundle.js'
}
}
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
"dev":"webpack --config ./webpack.dev.config.js --mode development"
}
2.1.3 安装 webpack-dev-server
npm install webpack-dev-server html-webpack-plugin --save-dev
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'),
open: true,
port: 9000
}
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
"dev":"webpack-dev-server --config ./webpack.dev.config.js --mode development"
}
2.1.4 安装 babel
npm install babel-core babel-loader babel-polyfill babel-preset-es2015 babel-preset-latest --save-dev
{
"presets": ["es2015", "latest"],
"plugins": []
}
修改webpack.dev.config.js文件
module: {
rules: [{
test: /\.js?$/,
exclude: /(node_modules)/,
loader: 'babel-loader'
}]
}
2.2 什么是面向对象
2.2.1 面向对象概念
class People {
constructor(name, age) {
this.name = name
this.age = age
}
eat() {
alert(`${this.name} eat something`)
}
speak() {
alert(`My name is ${this.name}, age ${this.age}`)
}
}
let zhang = new People('zhang', 20)
zhang.eat()
zhang.speak()
let wang = new People('wang', 21)
wang.eat()
wang.speak()
2.3 面向对象–继承
2.3.1 继承的作用
继承,子类继承父类
- People 是父类,
公共
的,不仅仅服务于 Student
2.3.2 继承的特点
class People {
constructor(name, age) {
this.name = name
this.age = age
}
eat() {
alert(`${this.name} eat something`)
}
speak() {
alert(`My name is ${this.name}, age ${this.age}`)
}
}
class Student extends People {
constructor(name, age, number) {
super(name, age)
this.number = number
}
study() {
alert(`${this.name} study`)
}
}
let xiaoming = new Student('xiaoming', 10, 'A1')
xiaoming.study()
console.log(xiaoming.number)
xiaoming.eat()
let xiaohong = new Student('xiaohong', 11, 'A2')
xiaohong.study()
xiaohong.speak()
2.4 面向对象–封装
2.4.1 封装的作用
封装,数据的权限和保密
public 完全开放
protected 对子类开放
private 对自己开放
2.4.2 封装的特点
减少耦合,不该外露的不外露
- 比如weight、girlfriend
不想让外人访问
,就不外露
- 如果
强行访问
,会报错
- 如果不这样,就要通过
文档约束
(仅限于人员少、沟通密切、没有恶意
的情况下)
- 一旦人多,比如
上百个人员协作,文档不全,沟通不密切
的情况下
- 一旦访问又没有报错,万一出现线上问题就比较麻烦了
利于数据、接口的权限管理
ES6 目前不支持
,一般认为_开头的属性是 private
class People {
name
age
protected weight
constructor(name, age) {
this.name = name
this.age = age
this.weight = 120
}
eat() {
alert(`${this.name} eat something`)
}
speak() {
alert(`My name is ${this.name}, age ${this.age}`)
}
}
class Student extends People {
number
private girlfriend
constructor(name, age, number) {
super(name, age)
this.number = number
this.girlfriend = 'xiaoli'
}
study() {
alert(`${this.name} study`)
}
getWeight() {
alert(`weight ${this.weight}`)
}
}
let xiaoming = new Student('xiaoming', 10, 'A1')
xiaoming.getWeight()
2.5 面向对象–多态
2.5.1 多态的作用
同一接口不同实现
JS 应用极少
需要结合 java 等语言的接口、重写、重载等功能
2.5.2 多态的特点
保持子类的开放性和灵活性
- 并
不是所有事情都让父类控制好,子类什么都不用做
- 可以通过
把公共的功能抽离出来,放在父类中去继承
- 这样可以
减少代码量,减少冗余,提高复用
- 但是如果子类中需要进行灵活的处理,还是可以进行
修改
的
面向接口编程
- 有时候不用管子类下面是如何实现的
- 只需要管
父类有多少接口,是怎么样的接口
- JS 引用极少
class People {
constructor(name) {
this.name = name
}
saySomething() {
}
}
class A extends People {
constructor(name) {
super(name)
}
saySomething() {
alert('I am A')
}
}
class B extends People {
constructor(name) {
super(name)
}
saySomething() {
alert('I am B')
}
}
let a = new A('a')
a.saySomething()
let b = new B('b')
b.saySomething()
2.6 JS 应用举例
jQuery 是一个 class
$('p') 是 jQuery 的一个实例
class jQuery {
constructor(selector) {
let slice = Array.prototype.slice
let dom = slice.call(document.querySelectorAll(selector))
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) {
}
}
window.$ = function (selector) {
return new jQuery(selector)
}
var $p = $('p')
console.log($p)
console.log($p.addClass)
2.7 面向对象的意义
2.7.1 为何使用面向对象
程序执行: 顺序、判断、循环 ———结构化
面向对象 ——— 数据结构化
- 对于计算机,
结构化的才是最简单的
- 编程应该
简单 & 抽象
3. UML 类图
Unified Modeling Language 统一建模语言
类图
,UML 包含很多种图,和设计模式相关的是类图
关系
,主要了解泛化
和关联
3.1 画图工具
MS Office visio
- https://www.processon.com/
3.2 类图
class People {
constructor(name, age) {
this.name = name
this.age = age
}
eat() {
alert(`${this.name} eat something`)
}
speak() {
alert(`My name is ${this.name}, age ${this.age}`)
}
}
类图
3.3 关系
class People {
constructor(name, house) {
this.name = name
this.house = house
}
saySomething() {
}
}
class A extends People {
constructor(name, house) {
super(name, house)
}
saySomething() {
alert('I am A')
}
}
class B extends People {
constructor(name, house) {
super(name, house)
}
saySomething() {
alert('I am B')
}
}
class House {
constructor(city) {
this.city = city
}
showCity() {
alert(`house in ${this.city}`)
}
}
let aHouse = new House('北京')
let a = new A('aaa', aHouse)
console.log(a)
let b = new B('bbb')
console.log(b)