17.面向对象

122 阅读3分钟

编程语言分类

  • 编程语言
    • 面向对象 OOP java、javascript、php、c#(ASP.NET)、Python、GO、c++、Ruby ...
    • 面向过程 POP c
  • 标记语言:html、css

面向对象

  • 面向对象编程「对象、类、实例」
    • 对象:万物皆对象(泛指)
    • 类:对对象的划分(按照其功能结构特点,划分出大类和小类)
    • 实例:类中具体的事务

# 面向对象,类比举例
/*
1.自然界
道法归一:自然界本身就是面向对象构建出来的
所有需要研究和学习的(认知)的事物都是“对象”
分类:微生物类、植物类、动物类
...
动物类:低等动物 人类
人类: 男人类 女人类
每一个男人都是男人类的一个实例
实例和实例之间 具有私有的特征 也存在大量公共的特征

2.js
js本身就是基于面向对象思想开发出来的编程语言,所以我们学习和开发js的时候,也要按照面向对象的思想去处理!
	「内置类」
    	每一种数据类型都一个自己所属的内置类:Number数字类(每一个数字/NaN/Infinity都是他的实例)、StringBoolean、Symbol、BigInt、Array、RegExp、DateFunctionObject...
        每一种DOM元素也都有自己所属的类
        	window -> window -> windowProperties -> EventTarget -> Object
            document -> HTMLDocument -> Document -> Node -> EventTarget -> Object
            div -> HTMLDivElement -> HTMLElement -> Element -> Node -> ...
            a -> -> HTMLAnchorElement -> HTMLElement -> Element -> Node -> ...
            querselectorAll -> HTMLCollection/NodeList/CSSStyleDeclaration/DOMTokenList
        ...

	学习数组 首先分析一个数组(实例),研究清楚这个实例的特征后(含:结构特点和常用方法等),我们再遇到其他的数组,直接也是按照相同的机制进行处理
    「自定义类」
    	创建一个函数 fn
        	+ fn() 普通函数执行「堆栈机制」
            + new fn() 构造函数执行 「堆栈机制 + 面向对象机制」
*/

函数执行

普通函数执行

/**
 * EC(G)
 * vo
 *  Fn = 0x000;scopt:G
 *  result 
 * 
 */
function Fn(x, y) {
  /**
   * EC(Fn) 0x000(10,20)
   * ao:
   *  x = 10
   *  y = 20
   *  total = 30
   * scope: Fn,G
   * this: window
   * param: x = 10,y=20
   * run
   *  window.x = 10
   *  window.y = 20
   *  没有返回值,默认返回undefined
   */
  let total = x + y;
  this.x = x; // window.x = 10
  this.y = y; // window.y = 20
}
let result = Fn(10,20)
console.log(result)

/*
undefined
*/

构造函数执行

  • new 函数():构造函数执行,它和普通的函数执行,还是有区别的
    • 「相似」
      • 一样是把函数执行(传递实参也是一样的)
      • 形成私有上下文「按照步骤逐一处理」
      • 也存在私有变量
      • ...
    • 「不同」
      1. new执行,浏览器会在当前上下文中,默认创建一个对象(实例对象)
      2. 在初始化this的时候,会让this指向这个实例对象
        • 代码中编写 this.xxx = xxx 的操作,都是给实例对象设置私有属性
        • 除了这些操作,其余的操作和实例对象没有直接关系
      3. 函数如果没有返回值,或者返回值是基本类型,则默认返回创建的实例对象; 如果自己返回的是引用类型值,以自己返回为主

「新称呼」函数被称为类,返回

/**
 * EC(G)
 * vo
 *  Fn = 0x000;scopt:G
 *  result = 0x001
 */
function Fn(x, y) {
  /**
   * EC(Fn) 创建实例对象0x001 *区别1
   * ao:
   *  x = 10
   *  y = 20
   *  total = 30
   * scope: Fn,G
   * this: 指向实例对象0x001 *区别2
   * param: x = 10,y=20
   * run
   *  window.x = 10
   *  window.y = 20
   *  没有返回值,默认返回实例对象 0x001 *区别3
   */
  let total = x + y; // total只是上下文中的私有变量,和实例对象没有直接关系
  this.x = x; // 给实例对象设置私有的属性或方法
  this.y = y; // window.y = 20
}
let result = new Fn(10, 20)
console.log(result)

/*
  Fn { x: 10, y: 20 }
 */