读者朋友们好,前面咱们已经讲解了有关javascript的基础,从今天的内容开始,咱们就要开始讲有关封装的内容了,这里,咱们就一点一点地接触到OOP(面向对象编程)了,若是做为一门语言使用的程序员连OOP都不知道是什么,或者只据说过,本身没有去领悟,不能写出面向对象的代码,那么也没有学习程序的必要了,下面我先会给你们详细的介绍面向对象是什么,面向过程是什么,要想弄明白面向对象,首先咱们就必须知道面向过程。在你已经弄明白了面向过程以后,咱们也不能盲目地为了OOP而OOP,那样只会是作一些徒劳的事,由于在大多数时候,咱们写一些代码只是为了解决一小事情,那么,咱们就不必写OOP了,只须要写一些面向过程的代码就能够了,用个词来形容“因地制宜”。 咱们就先从面向过程开始,先来解释一下过程是什么意思,咱们平时所说的“程序”二字其实过程,执行一个程序,也就是执行一个过程,例如:上班,就是一个程序,其中的过程通过是,9点准时到公司,作一些本身应该完成的事,下午6点无论作成什么样,上班的过程作完了,离开公司,这就是过程;再来个更具体的例子,取款,执行的过程咱们就写得更明白一点: 1、带上银行卡到ATM 2、插入银行卡 3、输入密码 4、输入取款数目 5、ATM吐钞 6、把钱放入本身兜里 6、若是发现没有取到本身想要数,返回第4步 7、若是要打印回执单,就点击打印回执单;若是不打印,就省略该步骤 8、退卡 9、程序完毕 从上面的步骤咱们能够看出,从第一步到最后一步,这就是执行顺序,第4到第6步就是一个循环过程,第7步是个分支过程,这就是过程,也就是程序。咱们写代码的目的就是模拟一些行为过程,用计算机的高速运算的特色为咱们的生活服务。 咱们就能够把取款封装成一个函数,这样,这就是一个独立的过程,在须要的时候,咱们就能够调用这个函数,就能完成咱们的工做须要,下面咱们就用一个最简单的例子来表达一个最简单的程序过程 复制代码 function KissWife(whoseWife){ console.log(whoseWife+"把脸凑过来"); console.log("我把嘴唇印上去"); console.log("木啊一声"); console.log("亲"+whoseWife+"一次完成"); } KissWife("我老婆"); 复制代码 看图说话,在合适的时候,咱们调用KissWife函数,输入合适参数,咱们执行完一个过程了。 OOP的目的就是提升代码的重用率,用最少的代码干尽可能多的事,使用参数,也是面向对象编程的一种体现,咱们来举个反例,若是咱们在不使用参数的状况下,咱们在想亲别人老婆的时候,就要从新写一个KissWife函数,这样,咱们就写了大量重复的代码,不方便代码管理,诸多不便,方法不顺溜,就算在亲别人老婆的时候被发现的机率就大大增长了,带来了一些没必要要的麻烦。 这时候有同窗想问了,我以为,我以为我不习惯使用参数,就是不想传递参数,代码管理哪里会出现不方便管理呢?好,这个问题问得至关的到位。 我来解释一下吧,若是在这个过程执行过程当中,咱们发现有不合理的地方,须要修改,例如,我还想伸个舌头啥的,咱们就要在亲本身老婆的函数中修改(麻烦),还要在亲别人老婆的函数中修改(麻烦+1),当咱们有不少个相似的函数的时候,是否是要所有作修改(麻烦+n);第二个坏处就是修改次数多了,你能保证一次性所有修改都不会出错吗(容易失误),这就能体现出了,若是咱们只是彻底写一些重复性的代码,工做效率大打折扣。 经过上面的讲解,其实新手读者们仍是没能理解什么是OOP(面向对象编程),咱们如今就从对象(object)开始讲解,这里的对象,不能单纯地理解成谈恋爱时所处的男女友,对象是指世间的万事万物,太阳,大海,人,宠物……;每一种咱们能够想获得的事物,每个对象都有本身的属性,行为。 咱们就能够像上图这样来理解,鸟就是一个对象,它有本身属性,有本身的行为,下面咱们就用具体代码来封装一个关于鸟的类。(注:在javascript语言中function关键字中仅仅用来定义函数,也能够定义类,它不能像高级语言那样使用Class关键字,后面咱们讲继承的时候,咱们还会用特殊方法来实现继承) 复制代码 //声明一个鸟类 function Bird(){ this.name = "鸽子"; this.color = "灰色"; this.habitat = "笼子"; this.weight = "500克"; } //使用原型链的方式,来定义鸟的行,也能够用来定义属性,可是,属性通常用this关键字来声明 //行为和属性,其实同一个级别的,后面咱们用for in来给你们验证 //鸣叫 Bird.prototype.Sing = function(){ console.log("咕咕咕"); } //进食 Bird.prototype.Eat = function(){ console.log("吃了一粒玉米"); } //飞翔 Bird.prototype.Fly = function(){ console.log("在天空中飞翔着"); } //孵蛋 Bird.prototype.Brood = function(){ cossole.log("正在孵化鸽子蛋"); } 复制代码 如今咱们类已经声明好了,可是咱们,怎么使用它呢?如今它只是一个类,还不是实例,就是我口头上所说的鸽子,实例,就是一只具体的鸽子,怎么才能获得一只具体的鸽子呢?看下面的代码 //用new 关键字来得到一个实例 var gezi = new Bird(); 如今咱们就能够调用它的属性,以及方法了 经过这样的方法咱们所获得的每个鸽子其实都是同样的,咱们要怎么才获得有本身特征的鸽子呢?有本身独有特征,其实就是属性不同,那们咱们就来改造一下函数的声明 复制代码 //其实咱们只须要在这里小小地修改一下 function Bird(_color,_habitat,_weight){ this.name = "鸽子"; this.color = _color; this.habitat = _habitat; this.weight = _weight; } 复制代码 而后咱们来看一下实例化一个鸽子的时候,怎么作 //咱们如今就实例化了两个鸽子 var gezi_A = new Bird("白色","野外","300克"); var gezi_B = new Bird("灰白色","温室","550克"); 这样,咱们就能够构造出有本身特征的鸽子出来了,从上面的例子,咱们其实已经不难看出,封装,其实就是把咱们能够形容的对象用类来表示,咱们就可经过new关键字来实例化出对象,这个对象就有本身独立的属性,行为,这样的一个对象,咱们就能够方便的供咱们操做,封装就是一种体现OOP的方法,咱们先是封装一个类,而后,再new 出实例,这样写就比咱们直接用代码来构造两次鸽子类少了不少的代码,若是咱们还构造第3只鸽子,就再new 一次就能够了,构造对象的时候,就感受一句代码的事。提升代码的重用率,OOP就这样体现出来了。 这时候,有人问了,只是在说咱们用OOP的好处 ,尚未看到不用OOP的代码到底怎么写,那们就来一个不用OOP的方式,一样以鸽子为例 复制代码 //声明一个鸽子 function GeZi_C(){ console.log("种类是鸽子"); console.log("颜色是蓝色"); console.log("住在树梢上"); console.log("体重400克"); console.log("在天空中飞翔着"); } //执行一次 GeZi_C(); 复制代码 若是咱们要再声明100个鸽子,是否是要写大量重复相似上面这样的代码呀,这就是面向过程的代码。相信新手朋友们已经有一个模糊的OOP概念了吧,慢慢体会,这种感受不一两天就能弄明白的,一口吃不成大胖子,后面咱们还会继续讲OOP思想的继承和多态。 继续先前在声明Bird类的时候,说的属性和行为是同一级别,并且是能够用两种方式来声明,属性在构造函数里面用 this 关键字声明,行为函数用 prototype 关键字来声明,prototype就是函数原型链的标准扩展,咱们之因此这样来写,就是把javascript语言的使用代入高级语言的范畴,用来模拟高级语言的使用,扯远了,咱们先来验证一下Bird实例对象中是否是拥有在同一级别的属性跟行为函数 复制代码 //咱们如今是用的前面的没有参数的Bird类 var obj = new Bird(); //逐一打印出来 for(var pro in obj){ console.log(pro + " : " + obj[pro]); } 复制代码 看到了吧,for...in就做用就是用来循环遍历对象的属性以及数组的下标,行为函数的名称其实也是对象的属性,如今就验证了前面的说法,相信你们如今对OOP的封装思想有必定的认知了。 总结一下,今天咱们所讲的东西其实就是把事物给抽象的拟态一下,而后,把这些属性行为给封装成一个类,使用new关键字实例化出具体对象,这样大大地提升了代码的使用率,提升了工做效率