面向对象
一种编程行业通用的写项目级的代码的思维,引导我们如何编写高质量的代码,万物皆对象 - 看待事物的角度,(属性:数据,行为:动作(方法) )。代码特点是封装和继承
分析代码 功能 或者任何事情 面向对象的思维
属性
行为
孙悟空
属性: 名字孙悟空、颜色、黄色、身高150、毛发多、
行为:会走路、会技能72变、
思维 去分析 轮播图
属性 有图片、有小圆点(索引器)、有上下箭头 、居中显示
有小圆点(小,选中,蓝色,未选中,黑色,中间存在间隔)
行为
自动轮播、点击上下页切换显示、点击指示器跳转显示、显示渐变效果显示
结合写代码的经验 从上面整理出有效的属性和行为 ->构造代码的结构
对象 就是指对象类型 Object
对象在内存中的示意图
创建对象的几种方式
1.字面量
特点:
- 简单粗暴
- 不适合创建多个同样类型的对象的场景
工厂函数
- 容易理解
- 失去
血缘关系,无法简单分辨对象的特征 - 后期无法实现继承
构造函数
-
可以方便的创建对象
- 拥有血缘关系
- 还有后续更多的优势
构造函数原理:
- 开辟空间
- 将新的创建的对象对象构造函数中的this
- 为对象赋值
- 将创建好的对象的地址返回
构造函数弊端
同一个 say 方法占据了两份内存
提取一个say方法
- 解决了浪费内存的弊端
- 但是造成了
污染全局变量的问题
// 提前将say 声明好
function say() { // 污染全局变量
console.log(this.name);
}
function createStudent(name, age) {
this.name = name;
this.age = age;
this.say = say
}
const obj = new createStudent("悟能", 83);
const obj1 = new createStudent("悟能1", 84);
console.log(obj.say === obj1.say); // true
原型模式
在构造函数的原型上 存放函数
- 解决了同一个
say浪费 内存的问题 - 解决了污染全局变量的问题
function createStudent(name, age) {
this.name = name;
this.age = age;
}
// 将刚才的全局函数say 直接挂载到 构造函数的原型上 即可
// prototype 是个对象 每一个构造函数都会内置有的. 我们称之为原型
createStudent.prototype.say = function () {
console.log(this.name);
}
const obj = new createStudent("悟能", 83);
const obj1 = new createStudent("悟能1", 84);
console.log(obj.say === obj1.say); // true
解释:
- 原型的单词是
prototype, 原型的这个名字是行业内共同认可的名字。 - 原型本质是一个对象,理解为
JavaScript自动帮我们添加的 - 原型是
JavaScript自动帮我们在定义构造函数的时候添加的 - 所有构造函数的实例,共享一个原型
- 原型上一般是挂载函
原型链继承
利用代码的能力实现 面向对象的特性 封装 和 继承
- 子类strudent 继承了父类 Person的属性
对象的两大特点
1.属性 - 属性的继承
2.行为-方法
让儿子也具有父亲的行为 => 把父亲的DNA 给到儿子即可
给儿子添加行为 儿子的原型上添加
父亲的行为 存放在父亲原型上