JS笔记04-对象(下)

【JS面向对象三大特征:封装、继承、多态】

封装:就是把抽象出的属性和对属性的操作封装在一起,属性被保护在内部,程序的其它部分只有通过被授权的操作(函数), 才能对属性进行操作。简单地说,就是把我们抽象出的属性和对属性的操作写到类的定义中,称为封装.

◆ js提供有以下几种控制方法和属性的访问权限:

① 公开级别:对外公开

② 私有级别:类本身可以访问,不对外公开.

JS笔记04-对象(下)

JS笔记04-对象(下)

说明:类名.prototype.函数名=function(){} 这个也称为后置绑定.

◆ JS中通过构造函数添加成员方法和通过原型法添加成员方法的区别

① 通过原型法分配的函数是所有对象共享的.

② 通过原型法分配的属性是独立.(如果你不修改属性,他们是共享)

③ 建议:如果我们希望所有的对象使用同一一个函数,最好使用原型法添加函数,这样比较节省内存.

JS笔记04-对象(下)

详细注释说明见案例代码

  • JS中的继承:

继承可以解决代码复用,让我们的编程更加靠近人类思维.当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类(比如刚才的Student),在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法.js 中没有extends 关键字,它可以通过如下方式实现继承.

(1)对象冒充

(2)call或者apply

继承方法一:对象冒充

JS笔记04-对象(下)

继承方法二:call 或者 apply

① 类名.call(对象名,参数,..)

② 类名.apply(对象名,[参数1, 参数2, ...])

核心代码如下:

JS笔记04-对象(下)

继承 总结:

① Object类是js所有类的基类

② js 通过“对象冒充”方式可以实现多重继承

JS笔记04-对象(下)

  • JS中的方法覆盖:

(1)方法重载就是类的同一种功能的多种实现方式,到底采用哪种方式,取决于调用者给出的参数。js不支持重载操作。因为Javascript 中的方法本身就是一个带可变参数的,通过在方法体内检测方法的参数情况,来实现重载的效果。(调用最后那个方法)

(2)覆盖,也称为改写,就是指子类中定义的方法替换掉父类的方法。

  • JS不支持重载

JS笔记04-对象(下)

但是可以通过判断参数的个数来实现重载,代码略(韩顺平的有,需要的时候可以参考)。

  • JS支持覆盖:要实现覆盖,需要把子类的方法,放在类定义的后面.

JS笔记04-对象(下)

  • JS的多态:所谓多态,就是指一个 变量在不同情况下的多种状态.js 实际上是无态的,是一种动态语言,一个变量的类型是在运行的过程中由js 引擎来决定的,所以说,js天生就支持多态。

JS笔记04-对象(下)

【代码】https://github.com/rxbook/study-javascript/tree/master/code03