Javascript基于对象三大特征

基本概述

JavaScript基于对象的三大特征和C++,Java面向对象的三大特征一样,都是封装(encapsulation)、继承(inheritance )和多态(polymorphism )。只不过实现的方式不同,其基本概念是差不多的。其实除三大特征之外,还有一个常见的特征叫做抽象(abstract),这也就是我们在一些书上有时候会看到面向对象四大特征的原因了。

封装性

封装就是把抽象出来的数据和对数据的操作封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作(成员方法),才能对数据进行操作。

案例:

  1. <html>
  2. <head>
  3. <script type="text/javascript">
  4. function Person(name, agei, sal){
  5. // 公开
  6. this.name = name;
  7. // 私有
  8. var age = agei;
  9. var salary = sal;
  10. }
  11. var p1 = new Person('zs', 20, 10000);
  12. window.alert(p1.name + p1.age);
  13. </script>
  14. </head>
  15. <body>
  16. </body>
  17. </html>

PS:JS封装只有两种状态,一种是公开的,一种是私有的。

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

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

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

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

案例:

  1. function Person(){
  2. this.name="zs";
  3. var age=20;
  4. this.abc=function(){
  5. window.alert("abc");
  6. }
  7. function abc2(){
  8. window.alert("abc");
  9. }
  10. }
  11. Person.prototype.fun1=function(){
  12. window.alert(this.name);//ok
  13. //window.alert(age);//no ok
  14. //abc2();//no ok
  15. this.abc();//ok
  16. }
  17. var p1=new Person();
  18. p1.fun1();

特别强调:我们前面学习的通过prototype给所有的对象添加方法,但是这种方式不能去访问类的私有变量和方法。

继承性

继承可以解决代码复用,让编程更加靠近人类思维。当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过继承父类中的属性和方法。

JS中实现继承的方式

1、对象冒充

案例:

  1. <html>
  2. <head>
  3. <script type="text/javascript">
  4. function Stu(name, age){
  5. this.name = name;
  6. this.age = age;
  7. this.show = function(){
  8. window.alert(this.name + " " + this.age);
  9. }
  10. }
  11. function MidStu(name, age) {
  12. this.stu = Stu;
  13. // 通过对象冒充来实现继承的
  14. // 对象冒充的意思就是获取那个类的所有成员,因为js是谁调用那个成员就是谁的,这样MidStu就有了Stu的成员了
  15. this.stu(name, age);
  16. this.payFee = function(){
  17. window.alert("缴费" + money * 0.8);
  18. }
  19. }
  20. function Pupil(name, age) {
  21. this.stu = Stu;
  22. // 通过对象冒充来实现继承的
  23. this.stu(name, age);
  24. this.payFee = function(){
  25. window.alert("缴费" + money * 0.5);
  26. }
  27. }
  28. var midStu = new MidStu("zs", 13);
  29. midStu.show();
  30. var pupil = new Pupil("ls", 10);
  31. pupil.show();
  32. </script>
  33. </head>
  34. <body>
  35. </body>
  36. </html>
2、通过call或者apply实现

案例:

  1. <html>
  2. <head>
  3. <script type="text/javascript">
  4. //1. 把子类中共有的属性和方法抽取出,定义一个父类Stu
  5. function Stu(name,age){
  6. // window.alert("确实被调用.");
  7. this.name=name;
  8. this.age=age;
  9. this.show=function(){
  10. window.alert(this.name+"年龄是="+this.age);
  11. }
  12. }
  13. //2.通过对象冒充来继承父类的属性的方法
  14. function MidStu(name,age){
  15. //这里这样理解: 通过call修改了Stu构造函数的this指向,
  16. //让它指向了调用者本身.
  17. Stu.call(this,name,age);
  18. //如果用apply实现,则可以
  19. //Stu.apply(this,[name,age]); //说明传入的参数是 数组方式
  20. //可以写MidStu自己的方法.
  21. this.pay=function(fee){
  22. window.alert("你的学费是"+fee*0.8);
  23. }
  24. }
  25. function Pupil(name,age){
  26. Stu.call(this,name,age);//当我们创建Pupil对象实例,Stu的构造函数会被执行,当执行后,我们Pupil对象就获取从 Stu封装的属性和方法
  27. //可以写Pupil自己的方法.
  28. this.pay=function(fee){
  29. window.alert("你的学费是"+fee*0.5);
  30. }
  31. }
  32. //测试
  33. var midstu=new MidStu("zs",15);
  34. var pupil=new Pupil("ls",12);
  35. midstu.show();
  36. midstu.pay(100);
  37. pupil.show();
  38. pupil.pay(100);
  39. </script>
  40. </html>

小结:

1、JS对象可以通过对象冒充,实现多重继承

2、Object类是所有Js类的基类

多态性

JS的函数重载

这个是多态的基础,在之前的Javascript入门已经说过了,JS函数不支持多态,但是事实上JS函数是无态的,支持任意长度,类型的参数列表。如果同时定义了多个同名函数,则以最后一个函数为准。

案例:

  1. <html>
  2. <head>
  3. <script type="text/javascript">
  4. //*****************说明js不支持重载*****
  5. /*function Person(){
  6. this.test1=function (a,b){
  7. window.alert('function (a,b)');
  8. }
  9. this.test1=function (a){
  10. window.alert('function (a)');
  11. }
  12. }
  13. var p1=new Person();
  14. //js中不支持重载.
  15. //但是这不会报错,js会默认是最后同名一个函数,可以看做是后面的把前面的覆盖了。
  16. p1.test1("a","b");
  17. p1.test1("a");*/
  18. //js怎么实现重载.通过判断参数的个数来实现重载
  19. function Person(){
  20. this.test1=function (){
  21. if(arguments.length==1){
  22. this.show1(arguments[0]);
  23. }else if(arguments.length==2){
  24. this.show2(arguments[0],arguments[1]);
  25. }else if(arguments.length==3){
  26. this.show3(arguments[0],arguments[1],arguments[2]);
  27. }
  28. }
  29. this.show1=function(a){
  30. window.alert("show1()被调用"+a);
  31. }
  32. this.show2=function(a,b){
  33. window.alert("show2()被调用"+"--"+a+"--"+b);
  34. }
  35. function show3(a,b,c){
  36. window.alert("show3()被调用");
  37. }
  38. }
  39. var p1=new Person();
  40. //js中不支持重载.
  41. p1.test1("a","b");
  42. p1.test1("a");
  43. </script>
  44. </html>

多态基本概念

多态是指一个引用(类型)在不同情况下的多种状态。也可以理解成:多态是指通过指向父类的引用,来调用在不同子类中实现的方法。

案例:

  1. <script type="text/javascript">
  2. // Master类
  3. function Master(name){
  4. this.nam=name;
  5. //方法[给动物喂食物]
  6. }
  7. //原型法添加成员函数
  8. Master.prototype.feed=function (animal,food){
  9. window.alert("给"+animal.name+" 喂"+ food.name);
  10. }
  11. function Food(name){
  12. this.name=name;
  13. }
  14. //鱼类
  15. function Fish(name){
  16. this.food=Food;
  17. this.food(name);
  18. }
  19. //骨头
  20. function Bone(name){
  21. this.food=Food;
  22. this.food(name);
  23. }
  24. function Peach(name){
  25. this.food=Food;
  26. this.food(name);
  27. }
  28. //动物类
  29. function Animal(name){
  30. this.name=name;
  31. }
  32. //猫猫
  33. function Cat(name){
  34. this.animal=Animal;
  35. this.animal(name);
  36. }
  37. //狗狗
  38. function Dog(name){
  39. this.animal=Animal;
  40. this.animal(name);
  41. }
  42. //猴子
  43. function Monkey(name){
  44. this.animal=Animal;
  45. this.animal(name);
  46. }
  47. var cat=new Cat("猫");
  48. var fish=new Fish("鱼");
  49. var dog=new Dog("狗");
  50. var bone=new Bone("骨头");
  51. var monkey=new Monkey("猴");
  52. var peach=new Peach("桃");
  53. //创建一个主人
  54. var master=new Master("zs");
  55. master.feed(dog,bone);
  56. master.feed(cat,fish);
  57. master.feed(monkey,peach);
  58. </script>

总结:

多态利于代码的维护和扩展,当我们需要使用同一类树上的对象时,只需要传入不同的参数就行了,而不需要再new 一个对象。

----------参考《韩顺平.轻松搞定网页设计(html+css+js)》

Javascript基于对象三大特征 -- 冒充对象的更多相关文章

  1. python----面对对象三大特征2

    多态 什么是多态?多态指的是一类事物有多种形态,例如一个动物类,狗和猫都通过继承动物类来得来,这样我们可以将狗.猫称作动物类的另一种形态. 在java中也存在多态,java中的多态是用来解决在一个函数 ...

  2. Java--面向对象三大特征-->封装、继承、多态

    简介 在面向过程当中只有存在封装(对功能的封装 例如c语言中的函数),而在面向对象中才存在这三大特性. 继承 -->inheritance 1.子类可以从父类继承属性和方法(除去父类私有化的方法 ...

  3. Java-面向对象三大特征、设计规则

    1)封装: 1.1)类:封装的是对象的属性和行为 1.2)方法:封装的是具体的业务逻辑实现 1.3)访问控制修饰符:封装的是访问的权限 2)继承: 2.1)作用:代码的复用 2.2)父类/基类:共有的 ...

  4. JS面向(基于)对象编程--三大特征

    抽象 在讲解面向对象编程的三大特征前,我们先了解什么叫抽象,在定义一个类时候,实际上就是把一类事物的共有的属性和行为提取出来,形成一个物理模型(模板).这种研究问题的方法称为抽象. 封装 什么是封装? ...

  5. JavaScript基于对象编程

    js面向对象特征介绍 javascript是一种面向(基于)对象的动态脚本语言,是一种基于对象(Object)和事件驱动(EventDirven)并具有安全性能的脚本语言.它具有面向对象语言所特有的各 ...

  6. 自学Python5.5-面向对象三大基本特征_继承

    自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...

  7. python---面对对象的三大特征

    一.三大特征 面对对象的三大特征:继承.多态和封装,继承在面向对象类的创建中非常常见. 1.继承 为什么会有继承,当我们要创建一个新类的时候,发现他有很多属性或者反法都和我们另一个类的方法相同,这时我 ...

  8. Python31之类和对象1(三大特征:多封继——多疯子)

    一.对象: Python即是面向对象的编程也是面向过程的编程语言,其内部可谓是无处不对象,我们所熟知的列表,字符串等工厂函数本质上都是对象.对象其实是对属性和方法的封装. 属性是对象的静态特征 方法是 ...

  9. 自学Python5.7-面向对象三大基本特征_封装

    自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...

随机推荐

  1. 多线程&&I/O

    不是操作系统的,是UNIX环境高级编程的!

  2. 编程练习:寻找发帖"水王"扩展问题一

    回顾 寻找发帖水王的问题总结起来就是在一个数组中某一个元素出现次数超过了数组长度的一半,那么可以很顺利的找到这个元素,实现见"编程练习:寻找发帖水王" 扩展 上面的问题中,强调了某 ...

  3. Anaconda使用入门

    简介 Conda是一个开源的包.环境管理器,可以用于在同一个机器上安装不同版本的软件包及其依赖,并能够在不同的环境之间切换 Anaconda包括Conda.Python以及一大堆安装好的工具包,比如: ...

  4. 【转】关于Java并发编程的总结和思考

    一.前言 就是想学习Java并发编程了,所以转载一下这篇认为还不错的博客~ 二.正文 编写优质的并发代码是一件难度极高的事情.Java语言从第一版本开始内置了对多线程的支持,这一点在当年是非常了不起的 ...

  5. clientHeight & clientWidth & offsetHeight & offsetWidth & outerWidth & innerWidth & outerWidth & outerHeight

    clientHeight & clientWidth & offsetHeight & offsetWidth MDN https://developer.mozilla.or ...

  6. ASP.NET页面之间传值QueryString(1)

    QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中.如果是传递一个或多个安全性要求不高或是结构简单的数值时,可以使用这个方法.但是对于传递数组或对象的话,就不能用这 ...

  7. 【心情】HNOI2018游记

    Day 0. 全机房的人好像都在做题.然而下午是社团节的游园会,身为社干的我风风雨雨在外面各种搬凳子搬椅子换场地招待外校同学……就这样我好像什么都没有复习. 晚上就一起去酒店了.大概因为是高一的缘故, ...

  8. POJ2406 Power Strings 【KMP 或 后缀数组】

    电源串 时间限制: 3000MS   内存限制: 65536K 提交总数: 53037   接受: 22108 描述 给定两个字符串a和b,我们定义a * b是它们的连接.例如,如果a =" ...

  9. HDU 1394 Minimum Inversion Number(树状数组/归并排序实现

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  10. QT QLayout 清空

    QLayout* pLayout = (QLayout*)ui->frame->layout(); )) { QWidget* pWidget = child->widget(); ...