初识面向对象
做软件开发的都会听过一个词,就是“面向对象”。外行可能不懂,说什么是对象?
这个?
还是这个?
哈哈哈,真是好大的对象。
不再开玩笑。其实在JS中,除了用字面量声明的基本数据类型之外,万物皆对象。换句话说只要是拥有自己的属性和方法的变量都是对象。
正题来啦。JS虽然是一个面向对象的语言,但是不是典型的面向对象语言。
那到底什么是面向对象?
面向对象其实简单说就是:专注于由哪一个对象来解决这个问题,编程特点是出现了一个类,从类中拿到对象,由这个对象去解决具体问题。
举个例子理解:我们家线路坏了,我们知道电工可以解决这个问题,就去找电工。其中电工就是一个类,而每一个电工都是不同的对象。上面说面向对象专注于由哪个对象来解决这个问题,而不是专注于实现的过程。就像在这个例子中,我们只要知道电工可以解决我们的线路问题就可以了,怎么解决其实就不是我们所要关注的范围了。
面向对象的三大特征对于优秀的计算机行业的精英们来说就更加耳熟了,封装,继承,和多态。
封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;
我们知道其实JS中没有接口的概念,但是没有什么太大的关系,不重要。我们只要知道封装的作用是限制访问(注意:不是拒绝访问)。
继承, 继承是指可以让某个类型的对象获得另一个类型的对象的属性的方法。
继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过继承创建的新类称为“子类”或“派生类”,被继承的
JS中的继承主要依赖原型链实现
多态,同一个行为有不同的表现形式。
举个例子:老师.下课铃响了(),学生.下课铃响了(),老师执行的是下班操作,学生执行的是放学操作,虽然二者消息一样,但是执行的效果不同。
实现多态,有重写和重载两种方式。
重写是存在子父类之间的,子类定义的方法与父类中的方法具有相同的方法名字,相同的参数表和相同的返回类型
在JS中实现
function rewrite(){
this.method = function (){
console.log('11111')
}
}
let aaa = new rewrite()
aaa.method = function () {
console.log("222222")
}
aaa.method()
最后的结果输出222222。因为子类的方法会覆盖掉父类的方法。
重载是指同一个类中的多个方法具有相同的名字,但这些方法具有不同的参数列表,即参数的数量或参数类型不能完全相同
在JS中实现
function reset(){
this.func = function(){
if(arguments.length === 0) {
console.log("arguments长度为0")
}else if(arguments.length === 1){
console.log("arguments长度为1")
}else if(arguments.length === 2){
console.log("arguments长度为2")
}else{
console.log("arguments长度为1,2,3以外的值")
}
}
}
let bbb = new reset()
bbb.func()
bbb.func('1')
bbb.func('1','2')
bbb.func('1','2','3')
bbb.func('1','2','3','4')
最后结果会根据参数的不同输出不同的结果。
因为在JS中并不存在多态的概念,上面的例子也只是模拟多态的实现。
over!!!