01-工厂函数
在JavaScript中 所有的对象都是由 构造函数创建的
所有的引用数据类型都属于对象
所有的引用类型数据创建 都需要使用关键字 new
工厂函数(一种用于创建对象的设计模式 —— 工厂模式)
工厂的定义 生产产品(创建对象)
工厂一般生产完整的产品 不需要后续加工
工厂函数的意义 就是 批量的创建对象 并且隐藏了复杂的创建细节
document.createElement()
document.createTextNode()
document.createAttribute()
functionComputer(mainboard, cpu, gpu, ram, rom, type) {
constcomputer = newObject();
computer.mainboard = mainboard;
computer.cpu = cpu;
computer.gpu = gpu;
computer.ram = ram;
computer.rom = rom;
computer.type = type;
returncomputer;
}
letc1 = Computer(‘Z690’, ‘I9-12900K’, ‘RTX3090’, ‘64G’, ‘2T’, ‘Apple’);
console.log(c1);
letc2 = Computer(‘Z650’, ‘I5-12500’, ‘RTX3070’, ‘16G’, ‘1T’, ‘Lenovo’);
console.log(c2);
02-构造函数
const reg = new RegExp(‘abc’);
const arr = new Array();
const d = new Date();
const map = new Map();
const set = new Set();
const o = new Object();
const num = new Number();
const s = new String();
const b = new Boolean();
———————————————————
类、构造函数、工厂函数 都采用大驼峰命名法 它们的作用都是创建对象
一个函数是普通函数 还是构造函数 主要取决于 调用方式
只要使用关键字new进行调用 函数就被看作是构造函数
没有使用 new 则为普通函数
当一个函数作为构造函数使用时 就会创建出一个新对象
构造函数中的this 指向新创建的对象
对象可以添加属性 (可以将属性添加在this关键字上)
这种添加在this关键字上的属性 是对象的私有属性
functionComputer() {
console.log(this);
this.a = ‘abc’;
}
let o = new Computer();
console.log(o);
console.log(typeof o);
let o2 = Computer();
console.log(o2);
leto3 = newComputer();
console.log(o3);
leto4 = newComputer();
console.log(o4);
console.log(o3 === o4);
构造函数中的this 指向的是新创建的对象<br /> this上添加的属性是 私有属性<br /> 所有私有属性会被 所有实例所获得<br /> functionFoo(a, b, c) {<br /> this.a = a;<br /> this.b = b;<br /> this.c = c;<br /> }<br /> constfoo1 = newFoo(1, 5, 7);<br /> constfoo2 = newFoo(2, 3, 7);<br /> constfoo3 = newFoo(6);<br /> console.log(foo1);<br /> console.log(foo2);
在构造函数中的this 添加方法 是实例的私有方法
当实例对象特别多的时候 会造成资源浪费(一般情况不会给构造函数添加私有方法)
函数是引用类型 每一个函数的地址都不同
03-原型对象
原型对象
prototype
原型是函数的一个子属性(任何函数都有这个属性,箭头函数除外)
在原型对象中 拥有一个固定的指针对象 constructor 这个指针 指向当前函数
原型对象的作用是用于保存实例对象的 公有属性 和 公有方法
console.log(Computer.prototype);
console.log(Computer.prototype.constructor === Computer);
console.log(Computer)
Computer.prototype.abc = 123;
Computer.prototype.play = function (name) {
console.log(${this.type} 电脑 正在运行 ${name}
);
}
04-面向对象编程
面向对象程序设计(Object Oriented Programming)作为一种新方法,其本质是以建立模型体现出来的抽象思维过程和面向对象的方法。模型是用来反映现实世界中事物特征的。任何一个模型都不可能反映客观事物的一切具体特征,只能对事物特征和变化规律的一种抽象,且在它所涉及的范围内更普遍、更集中、更深刻地描述客体的特征。通过建立模型而达到的抽象是人们对客体认识的深化。
编程思想
-1. 面向对象编程 (基于 Class)
-2. 面向过程编程 (基于 Function ) 函数式编程
面向对象是一种编程思想 这种编程思想来自面向对象编程语言(Java C# Php …)
JavaScript 并不是面向对象编程语言
JavaScript 中 没有类(Class)
ECMAScript 2015 新增关键字 class
他的本质并不是类 他的本质是函数 class
关键字是构造函数的语法糖
JavaScript 的语言特性 允许实现 类似于 面向对象编程语言的行为(特征)
### 面向对象语言的特征
1. 封装 包装 将一些相关的物品打包整理放到一起 组成一个整体 -> 对象
2. 继承 从其他对象上 获得 属性 和 方法
3. 多态 多种形态(状态) 函数在执行过程中的多种形态
通常使用的编程逻辑 可以实现 封装、继承、多态 所以可以将JavaScript看作是面向对象的编程语言
```js
多态在面向对象编程语言中 体现形式为 函数重载(允许有相同的函数名)
JS不允许重名函数 所以不支持函数重载
function fn(int a){}
function fn(int a,int b){}
fn(3);
fn(4,8);
### 类(Class)
类 种类 类型
类是一个非常抽象的概念 它是一个较大范围的概括
猫(Cat)
哺乳类猫科动物
肉食性动物
四条腿
鼠类天敌
反应快 动作灵敏
好奇心强
细化——>让这个类更加具体
布偶
美短
英短
加菲
暹罗
再具体一点
布偶猫
具体到 我同事养了一只布偶猫 2岁 母猫 非常粘人 名字叫葡萄
全色毛色是白色 鼻子粉红色
类和对象
对象 是类的 具象化
类是 对象的 抽象化
### 面向对象的思想 来源于生活
在所有面向对象的编程语言中 对象都是由 类 创建的
在JS中 对象是由 构造函数创建的
使用了 关键字 new 进行对象创建
JS中的构造函数 等价于 面向对象编程语言中的类(构造函数 就可以看作是 类)