面向对象 对象在内存中的示意图 创建对象的几种方式 字面量 工厂函数 构造函数 构造函数原理: 构造函数弊端 提取一个say方法 原型模式 原型链继承 对象

181 阅读3分钟

面向对象

一种编程行业通用的写项目级的代码的思维,引导我们如何编写高质量的代码,万物皆对象 - 看待事物的角度,(属性:数据,行为:动作(方法) )。代码特点是封装和继承

分析代码 功能 或者任何事情 面向对象的思维

属性

行为

孙悟空

属性: 名字孙悟空、颜色、黄色、身高150、毛发多、

行为:会走路、会技能72变、

思维 去分析 轮播图

属性 有图片、有小圆点(索引器)、有上下箭头 、居中显示

有小圆点(小,选中,蓝色,未选中,黑色,中间存在间隔)

行为

自动轮播、点击上下页切换显示、点击指示器跳转显示、显示渐变效果显示

结合写代码的经验 从上面整理出有效的属性和行为 ->构造代码的结构

对象 就是指对象类型 Object

对象在内存中的示意图

1651110357925.png

创建对象的几种方式

1.字面量

特点:

  • 简单粗暴
  • 不适合创建多个同样类型的对象的场景

1651110436283.png

工厂函数

  1. 容易理解
  2. 失去血缘关系,无法简单分辨对象的特征
  3. 后期无法实现继承

1651110474178.png

构造函数

  1. 可以方便的创建对象

  2. 拥有血缘关系
  3. 还有后续更多的优势

构造函数原理:

  1. 开辟空间
  2. 将新的创建的对象对象构造函数中的this
  3. 为对象赋值
  4. 将创建好的对象的地址返回

1651110543549.png

构造函数弊端

同一个 say 方法占据了两份内存

1651110627050.png

提取一个say方法

  1. 解决了浪费内存的弊端
  2. 但是造成了 污染全局变量 的问题
    // 提前将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

原型模式

在构造函数的原型上 存放函数

  1. 解决了同一个 say 浪费 内存的问题
  2. 解决了污染全局变量的问题
    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 自动帮我们在定义构造函数的时候添加的
  • 所有构造函数的实例,共享一个原型
  • 原型上一般是挂载函

1651115113756.png

原型链继承

利用代码的能力实现 面向对象的特性 封装继承

  1. 子类strudent 继承了父类 Person的属性

1651115279366.png

对象的两大特点

1.属性 - 属性的继承

2.行为-方法

让儿子也具有父亲的行为 => 把父亲的DNA 给到儿子即可

给儿子添加行为 儿子的原型上添加

父亲的行为 存放在父亲原型上