面向对象(五)
多态
我仔细看了一下,这里说的JavaScript 的多态好像和Java的多态不一样,
- Java 的多态讲的是类的继承,父类实例指向子类对象,父类方法的重写
- JavaScript的多态是一个方法多种调用方式
还是有一些不同, 上代码
// 多态
function add() {
// 获取参数
let arg = arguments
// 获取参数长度
let len = arg.length
switch(len) {
// 如果没有参数
case 0:
return 10;
// 如果只有一个参数
case 1:
return 10 + arg[0]
// 如果有两个参数
case 2:
return arg[0] + arg[1]
}
}
// 测试用例
console.log(add()) // 10
console.log(add(5)) // 15
console.log(add(6, 7)) // 13
另一种更易懂的形式(更像面向对象的方式)
function Add(){
// 无参数算法
function zero() {
return 10
}
// 一个参数的算法
function one(num) {
return 10+num
}
// 两个参数的算法
function two(num1, num2){
return num1+num2
}
this.add = function() {
let arg = arguments
let len = arg.length
switch(len) {
case 0:
return zero()
case 1:
return one(arg[0])
case 2:
return two(arg[0], arg[1])
}
}
}
// 实例化类
let A = new Add()
// 测试
console.log(A.add()) // 10
console.log(A.add(5)) // 15
console.log(A.add(6, 7)) // 13
总结一下(这里的能稍微看看就行)
在JavaScript中
封装
- 封装与集成是面向对象中的两个主要特性,继承即是对原有对象的封装,从中创建私有属性,私有方法,特权方法,共有属性,共有方法等。
- 有的不论对类如何实例化,它只创建一次,这类属性或方法我们称之为静态的
- 只被类所拥有的属性和方法是静态类属性和静态类方法 (这段有点没说清楚)
- 可以被继承的的方法与属性 一类是在构造函数中,这类属性与方法在对象实例化时 被复制一遍
- 另一类在类的原型对象中,这类属性与方法在对象实例化时被所有实例化对象所共用
继承
如果实例化的是对象,那么则为对象继承 (这个说法真飘逸= =)
如果实例化的是类(当然累也是一种对象,只不过是用来创建对象的), 那么就是一种类的继承
通过原型链继承的方式我们称之为类式继承
通过构造函数继承的方式我们称之为构造函数式继承
这两种方式组合起来的方式我们称之为组合式继承
由于类式继承过程中会实例化父类,这样如果父类构造函数极其复杂,那么这种方式对构造函数的开销是不值得的,所以有了一种新的继承方式,通过在一个函数内的过度对象实现继承并返回新对象的方式,我们称之为寄生式继承
我们再结合构造函数式继承,这样再融合构造函数继承中的有点并去除其缺点,得到的继承方式就是 寄生组合式继承,
有时候子类对父类实现继承可以通过拷贝方法与属性的方式来实现,这就有了多继承,即将多个父类(对象)的属性与方法拷贝给子类实现继承
这里的JavaScript的多态,通过对传递参数判断来决定执行逻辑,可以实现一种多态处理机制(和Java不太一样)
面向对象基础就暂时这样了,后面就开始正式的面向对象的实战应用,设计模式了...