Day10 知识点概要

1.ES6的面向对象

1. 类的定义即方法定义

  1. 类名后面不加括号
  2. 构造函数和普通方法都不需要加function
class Father{
    constructor(uname){
        this.uname = uname
    }
    say(){
        console.log(this.uname)
    }
}

2. 类的继承

  1. extends关键词:class Son extends Father{}
  2. super:当子类有自己的构造函数时(没有的话就会自动调用父类的构造函数),需要在子类的构造函数内使用super()调用父类的构造函数才能拥有子类的this,同时这个super调用要在子类构造函数的this.属性 = 属性值 语句之前调用,这样才能正常使用父类的方法和自身的方法。

3. 几个注意点

  1. ES6中class没有变量提升,所以需要先定义类,才实例化对象
  2. 类里面的共有属性和方法一定要加this使用
  3. constructor里面的this指向实例化对象,方法里的this指向这个方法的调用者

2.ES5中的面向对象

1.构造函数和原型

  1. 构造函数创建对象
    1. 方法
    function Star(uname, age){
        this.uname = uname
        this.age = age
        this.sing = function(){
            console.log('sing')
        }
    }
    var star1 = new Star('ldh', 20)
    
    2.缺陷:如果方法都在内存中定义的话,那么不同对象的方法都要不同的内存空间,费内存,从而引出了构造函数的原型对象
  2. 构造函数的原型对象prototype与实例的对象原型
    1. 定义
      1. 原型对象prototype:是属于构造函数的属性,把方法通过构造函数.prototype.方法名 = function(){} 的形式添加,就可以使每个实例共享一个内存里面的方法,节省内存。
      2. 对象原型__proto__: 是属于对象的属性,指向构造函数的原型对象,所以对象.__proto__ === 构造函数.prototype
      3. _proto_ 和prototype都有一个constructor属性,它指回构造函数本身
    2. 三角关系、原型链、对象成员(属性和方法都是成员)查找规则
      1. 构造函数、实例和原型对象的三角关系
      2. 原型链
      3. 对象成员查找规则:对象实例-->原型对象-->上层原型对象直至Object原型对象-->null
      4. 原型对象中的this指向还是指向对象实例,因此原型对象内定义的方法还是符合谁调用this就指向谁的规则。
    3. 原型对象的应用:利用原型对象拓展内置对象的方法
    //以数组为例
    Array.prototype.sum = function(){
        var sum = 0
        for(var i = 0; i < this.length; i++){
            sum += this[i]
        }
        return sum
    }
    

2.继承

  1. call方法(属于函数的方法):
  2. 继承父构造函数
    1. 继承属性
    2. 继承方法(ps:1.注意不要直接子构造函数的prototype直接等于父构造函数的prototype;2.记得利用constructor指回原来的构造函数)
  3. 类(class)的本质:本质还是function,是语法糖

3.ES5中新增的方法

  1. 遍历数组方法:forEach()、map()、filter()、some()、every()
  2. 去除前后空格字符串方法:trim()
  3. 对象方法:defineProperty()、keys()

本文章使用limfx的vscode插件快速发布