JS笔记04-对象(下)
【JS面向对象三大特征:封装、继承、多态】
封装:就是把抽象出的属性和对属性的操作封装在一起,属性被保护在内部,程序的其它部分只有通过被授权的操作(函数), 才能对属性进行操作。简单地说,就是把我们抽象出的属性和对属性的操作写到类的定义中,称为封装.
◆ js提供有以下几种控制方法和属性的访问权限:
① 公开级别:对外公开
② 私有级别:类本身可以访问,不对外公开.
说明:类名.prototype.函数名=function(){} 这个也称为后置绑定.
◆ JS中通过构造函数添加成员方法和通过原型法添加成员方法的区别
① 通过原型法分配的函数是所有对象共享的.
② 通过原型法分配的属性是独立.(如果你不修改属性,他们是共享)
③ 建议:如果我们希望所有的对象使用同一一个函数,最好使用原型法添加函数,这样比较节省内存.
详细注释说明见案例代码
-
JS中的继承:
继承可以解决代码复用,让我们的编程更加靠近人类思维.当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类(比如刚才的Student),在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法.js 中没有extends 关键字,它可以通过如下方式实现继承.
(1)对象冒充
(2)call或者apply
继承方法一:对象冒充
继承方法二:call 或者 apply
① 类名.call(对象名,参数,..)
② 类名.apply(对象名,[参数1, 参数2, ...])
核心代码如下:
继承 总结:
① Object类是js所有类的基类
② js 通过“对象冒充”方式可以实现多重继承
-
JS中的方法覆盖:
(1)方法重载就是类的同一种功能的多种实现方式,到底采用哪种方式,取决于调用者给出的参数。js不支持重载操作。因为Javascript 中的方法本身就是一个带可变参数的,通过在方法体内检测方法的参数情况,来实现重载的效果。(调用最后那个方法)
(2)覆盖,也称为改写,就是指子类中定义的方法替换掉父类的方法。
-
JS不支持重载
但是可以通过判断参数的个数来实现重载,代码略(韩顺平的有,需要的时候可以参考)。
-
JS支持覆盖:要实现覆盖,需要把子类的方法,放在类定义的后面.
-
JS的多态:所谓多态,就是指一个 变量在不同情况下的多种状态.js 实际上是无态的,是一种动态语言,一个变量的类型是在运行的过程中由js 引擎来决定的,所以说,js天生就支持多态。
【代码】https://github.com/rxbook/study-javascript/tree/master/code03