面向对象编程

96 阅读2分钟

面向对象

对象是什么?为什么要面向对象 / 优势 =》 简化我们对于行为岔路的预备

特点:逻辑迁移更加灵活,代码复用性高,高度模块化的体现

  • 模块、接口 => 对象

对象的理解

  • 对象对于有单个物体的简单抽象
  • 对象是一个容器,封装了属性和方法 ** 属性:对象的状态 ** 方法:对象的行为
//简单对象
const Course = {
teacher:`云隐`,
leader:`小异`,
startCourse:function(name){ 
     return `开始${name}课`;
   }
}

function Course(){
     this.teacher:`云隐`;
     this.leader:`小异`;
     this.startCourse = function(name){
         return `开始${name}课`;
     }
}
//构造函数 => 严谨化构造一个对象

构造函数 - 生成对象

需要一个模板-表征了一类物体的共同特征,从而生成对象

类即对象模板

js其实本质上并不是直接基于类,基于构造函数+原型链 => constructor+ prototype

function Course(teacher){
     this.teacher = teacher;
     this.leader = `小异`;
     this.startCourse = function(name){
         return `开始${name}课`;
     }
}
const course = new Course('云隐');//新的对象

Course 本质就是构造函数

  • 1.函数体内使用的this,指向所要生成的实例
    1. 生成实例对象需要new来进行实例化
  • 3.可以做初始化传参

追问:

如果构造函数不初始化,可以作为对象生成器使用吗? - 不可以

如果项目需要使用,(又不想被外部感知),通常如何解决?

//使用方
const course = Course();

//单例模式 => 全局维护唯一实例 => 解决对象实例化生成问题
function Course(teacher){
   const _isClass = this instanceof Course;
   if(!_isClass){
      return new Course();
      }
   this.teacher = teacher;
   this.leader = "小伊"
   this.startCourse= function(name){
       return `开始${name}课`;
     }
  }
  • 启发:在编写底层api时,尽量做到不需要让外部感知内部类型

引发思考, new是什么 / new原理 / new的时候做了什么

function Cpurse(){}
const course =  new Course();
  • 1.结构上:创建了一个空对象,作为返回的对象实例
  • 2.将生成空对象的原型对象(proto)指向了构造函数的prototype属性
  • 3.关系上:将当前实例对象赋给了内部的this
  • 4.生命周期上:执行了构造函数的初始化代码

追问:实例化生成对象原因 - 独立

functionCourselves(teacher){
this.teacher= teacher;
this.leader= '小伊';
this.startCourse = function(name)【
return `开始${name}课`;
}
}
const course1 = new Course(`云隐`);
const course2 = new Course(`吴彦祖`);

course2.teacher = `云隐帅`
  • => 都是面向对象做铺垫的

(重点)

constructor 是什么?

functionCourselves(teacher){
this.teacher= teacher;
this.leader= '小伊';
this.startCourse = function(name)【
return `开始${name}课`;
}
}
const course =  new Course();
  • 1.每个对象在创建时,会自动拥有一个构造函数属性constructor
  • 2.constructor继承自原型对象,指向了构造函数的引用
  • 实力获得类的属性 => (大胆点) 继承了类的属性

追问:使用构造函数继承属性就没有问题么/ 会有什么性能上的问题?

function Course(name){
     this.teacher = `云隐`;
     this.leader = `小伊`;
     this.startCourse =  function(name){
       return `开始${name}课`;
      }
  }
  const course1 = new Course(`this`)
  const course2 = new Course(`OOP`)
    //构造函数中的方法会存在于每一个生成的实力内,而方法往往需要模板统一化,重复的挂载只会浪费资源

=> 思考:如何进行优化? 前面提到的原型对象又是什么?

原型对象

image.png

function Course();
const course1  = new Course();
const course2  - new Course();
  • 1.构造函数:用来初始化创建对象的函数 - Course ** 自动给构造函数赋予一个属性prototype,该属性等于实例对象的__proto__

  • 2.实例对象:course1,根据原型对象创建出来的实例 ** 每个实例都会在创建是,具备一个constructor ** constructor由继承而来,并指向当前的构造函数 ** 每个被生产的对象中,都有一个__proto__

  • 那么prototype是什么呢?

  • 3.原型对象:Course.prorotype

function Course(name){
     this.teacher = `云隐`;
     this.leader = `小伊`;
  }
  //方法挂载到构造函数的原型对象上
  Course.prototype.startCourse = function(name){
     return `开始${name}`
   }
  const course1 = new Course(`this`);
  const course2 = new Course(`OOP`);