JS面向对象

91 阅读3分钟

认识面向对象

  • 面向对象就是一种编程思想
  •  轮播图:
             *          面向过程的思想
             *              创建第一个轮播图
             *                  1. const banner = xxx
             *                  2. const imgBox = xxx
             *                  3. const focus = xxx
             *                  4. const index = xxx
             *                  5. function copyEle () {操作 imgBox}
             *                  6. function setFocus () {操作 focus}
             *                  7. function autoPlay () {操作 imgBox 和 index}
             *              创建第二个 轮播图
             *                  1. const banner2 = xxx
             *                  2. const imgBox2 = xxx
             *                  3. const focus2 = xxx
             *                  4. const index2 = xxx
             *                  5. function copyEle2 () {操作 imgBox2}
             *                  6. function setFocus2 () {操作 focus2}
             *                  7. function autoPlay2 () {操作 imgBox2 和 index2}
             *          面向对象的思想
             *                  b1 = {
             *                      banner: xxx,
             *                      imgBox = xxx,
             *                      focus = xxx,
             *                      index = xxx,
             *                      copyEle () {操作 this 的 imgBox},
             *                      setFocus () {操作 this 的 focus},
             *                      autoPlay () {操作 this 的 imgBox 和 this 的 index}
             *                  }
             *                  b2 = {
             *                      banner: yyy,
             *                      imgBox = yyy,
             *                      focus = yyy,
             *                      index = yyy,
             *                      copyEle () {操作 this 的 imgBox},
             *                      setFocus () {操作 this 的 focus},
             *                      autoPlay () {操作 this 的 imgBox 和 this 的 index}
             *                  }
             * 
    

批量生产对象

  • 工厂函数方式创建对象:
  • 工厂函数其实就是一个函数
  • 手动创建一个对象
  • 手动给对象添加属性
  • 手动返回一个对象
  • // 3. 工厂函数
           function createObj (name, age) {
               // 1. 手动创建一个对象
               const obj = {}
     
               // 2. 手动向对象内部添加属性
               obj.name = name
               obj.age = age
     
               // 3. 手动返回一个对象
               return obj
           }
    
      const o1 = createObj('QF001', 18)
      const o2 = createObj('QF002', 28)
      const o3 = createObj('QF003', 38)
      console.log(o1)
      console.log(o2)
      console.log(o3)
​
  
​
- 自定义构造函数:
​
- 自定义构造函数,本质就是一个函数
​
- 但他和new 关键字连用的时候,就叫做构造函数
​
- 自动创建一个对象
​
- 手动向创建的对象添加属性
​
- 自动返回一个对象
​
- ```javascript
   // 4. 自定义构造函数
          function createObj () {
              // 1. 自动创建出来一个对象
  
              // 2. 手动向对象添加属性
  
              // 3. 自动返回一个对象
          }
  
          const o1 = new createObj()  // 这种调用方式, 才是 构造函数
          const o2 = createObj()     // 这就是一个普通函数的调用
  
          console.log(o1)
          console.log(o2)

自定义构造函数的书写

  • 一定是和new关键字连用,如果没有和new连用,那么他就是一个普通函数
  • 当一个函数和new关键字连用的时候,这个函数就被称为自定义构造函数,这个函数内的this指向,指向返回出来对象
  • 构造函数不能使用给箭头函数,因为箭头函数内部没有this
  • 构造函数内部不需要return
  • 书写构造函数时,首字母建议大写,目的:仅仅是为了和普通函数区分
  • 构造i函数通过 new 关键字创建出来的对象,叫做实例化对象,本质上还是一个对象,只不过名字上叫做实例化对象;构造函数通过new关键字创建对象的过程叫做实例化
  • function createObj(num1, num2) {
              // 此时 this === 将来被返回出去的对象
              this.a = num1
              this.b = num2
    ​
              // return '我是 一个 普通字符串'
              // return [1, 2, 3, 4, 5]
          }
          const o1 = new createObj(1, 2)
          const o2 = new createObj(10, 20)
          console.log(o1)
          console.log(o2)
    ​
          function Person() {
              this.name = 'QF001'
          }
          const p1 = new Person()
    ​
          /**
           *  const p1 = new Person()
           * 
           *      new Person()        此时这个过程叫做 实例化, Person函数因为和new关键字连用, 我们叫做自定义构造函数
           * 
           *      此时 常量 p1    我们叫做 实例化对象(实例对象)
          */
    

原型

函数访问原型:函数.prototype

对象访问原型:

对象.__proto__
 function Person(name, age) {
            this.name = name
            this.age = age
        }
        Person.prototype.a = '我是后续通过 JS 代码添加到函数的原型内部的属性'
        Person.prototype.sayHi = () => {
            console.log('你好')
        }
        console.log(Person.prototype)   // 打印函数 Person 的原型
​
​
        const p1 = new Person('QF001', 18)
        const p2 = new Person('QF002', 28)
 p1.sayHi()
        console.log(p1.__proto__)
        console.log(p1.a)
​
        console.log(p1.__proto__ === Person.prototype)   // 打印对象的构造函数的原型
        
        console.log(p1.sayHi)
        console.log(p2.sayHi)
        console.log(p1.sayHi == p2.sayHi)

ES6类的语法:class类名{xxxxx}

 class Stu {
            constructor(name) {
                // 这个位置和构造函数的 函数一样
                this.name = name
            }
​
            // 这个位置开始, 全都是原型
        }
        const s1 = new Stu('QF001')
        console.log(s1)