封装类
私有属性、私有方法:声明在函数内部的变量,在块级作用域下不能被外部访问
对象共(公)有属性、对象共(公)有方法:在函数内部,通过this创建的属性和方法。
特权方法:通过公有方法来访问类的私有变量,这种公有方法称为特权方法。
构造器:创建对象时用到的特权方法也称为构造器。
静态共有属性、静态共有方法:在类外通过点语法定义的属性和方法。
共有属性、共有方法:通过prototype创建的属性和方法,能在this中访问到。
有new关键字:通过构造函数对当前对象的this赋值。
无new关键字: 直接执行函数。
类的三个部分:
| 内涵 | 备注 | |
|---|---|---|
| 构造函数内 | (属性、方法)供实例对象复制 | |
| 构造函数外 | (属性、方法)由点语法添加类对象可访问,实例对象没有复制访问不到 | |
| 原型中 | 实例对象可通过原型链访问,类对象不能直接访问这些共有属性、方法,必须通过类的原型对象(类.prototype)来访问。 | 类的原型对象的作用:通过点语法给类的原型添加共有方法,但是类不能直接访问这些共有属性、方法,只有类的实例可以访问。 |
继承:
对原有对象的封装,从中创建私有属性、私有方法、特权方法、共有属性、共有方法等。对象可被继承的的只有2类,一、构造函数中的属性、方法;二、原型对象中的属性、方法。
类式继承:
类式继承原理:
把父类的实例(new SuperClass())赋给子类的原型(SubClass.prototype),即SubClass.prototype继承了
SuperClass。
实例化父类的过程中,新创建的对象(new SuperClass())复制了父类的属性和方法,并且将原型指向父类的原型对象。
因此,子类的原型对象(SubClass.prototype)=新创建的对象(new SuperClass()),可以访问父类构造函数复制的属性和方法,还可以直接访问父类原型上的属性和方法。
子类的使用:
以此类推,子类的实例,可访问子类的属性和方法,也可以访问子类原型链上的属性和方法(包含父类构造函数复制的属性和方法、父类原型上的属性和方法)。
instanceof:
检测某个对象是不是某个类的实例
局限:
如果父类的共有属性是引用类型,在继承后会被所有子类的实例共用,一个子类实例更改了该共有属性,别的子类实例都会改变。
构造函数式继承:
构造函数式继承原理:
SuperClass.call(this,id)
在子类的构造函数作用环境中执行一次父类的构造函数。子类继承了父类的共有属性,但是不继承原型链上的属性、方法。
局限:
如果想继承原型链上的属性方法,用构造函数方法每个实例单独拥有一份,不能共用原型链上的属性方法。
组合式继承:
兼具了类式继承的“子类的原型对父类进行实例化”,和构造函数继承的“在子类的构造函数作用环境中执行一次父类的构造函数”。
局限:
打破以上2种继承的局限性,但是父类构造函数调用了2次,不够完美。
原型式继承:
把类式继承的子类封装为一个过渡的对象,用于创建返回的实例
局限: 同类式继承
寄生式继承:
对原型式继承的封装(类式继承的二次封装),可以对继承的对象拓展新的属性和方法。
寄生组合式继承:
原理:
子类继承了父类的原型(主要解决这个问题),子类原型被赋予了父类原型的引用。如果要拓展原型方法和属性,必须得用prototype的点语法添加。
使用:
多继承:
javascript原型链是一条单链,理论上不能实现多继承。但是可以实现多个对象复制到目标对象上。
多态:
1个方法多种调用方式,一般是在方法内对参数进行判断