1、JavaScript面向对象的三大特性

JavaScript的三大特性:封装性、继承性、多态性。

2、JavaScript实现封装特性

  在一些静态类型的语言如java中,本身语法就提供了这些功能。js当中只能依靠变量的作用域来实现封装的特性,并且只能模拟出public和private两种特性。封装实现就是是对象内部的变化对外界是透明的,不可见。这种做法使对象之间低耦合,便于维护升级,团队协作开发。

3、JavaScript实现继承特性

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

  1、通过call或者apply实现继承

  1. //1.把子类中共有的属性和方法抽取出,定义一个父类Stu
  2. function Stu(name,age){
  3. //window.alert("确实被调用.");
  4. this.name=name;
  5. this.age=age;
  6. this.show=function(){
  7. window.alert(this.name+"年龄是="+this.age);
  8. }
  9. }
  10. //2.通过call或者apply来继承父类的属性的方法
  11. function MidStu(name,age){
  12. //这里这样理解: 通过call修改了Stu构造函数的this指向,
  13. //让它指向了调用者本身.
  14. Stu.call(this,name,age);
  15. //如果用apply实现,则可以
  16. //Stu.apply(this,[name,age]); //说明传入的参数是 数组方式
  17. //可以写MidStu自己的方法.
  18. this.pay=function(fee){
  19. window.alert("你的学费是"+fee*0.8);
  20. }
  21. }
  22. function Pupil(name,age){
  23. Stu.call(this,name,age);//当我们创建Pupil对象实例,Stu的构造函数会被执行,当执行后,我们Pupil对象就获取从 Stu封装的属性和方法
  24. //可以写Pupil自己的方法.
  25. this.pay=function(fee){
  26. window.alert("你的学费是"+fee*0.5);
  27. }
  28. }
  29. //测试
  30. var midstu=new MidStu("zs",15);
  31. var pupil=new Pupil("ls",12);
  32. midstu.show();
  33. midstu.pay(100);
  34. pupil.show();
  35. pupil.pay(100);
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>Insert title here</title>
  8. </head>
  9. <body>
  10. <script type="text/javascript">
  11. function Animal(name,age){
  12. this.name=name;
  13. this.age=age;
  14. this.shout=function(){
  15. alert("我是:"+this.name+",今年:"+this.age);
  16. };
  17. this.action=function(){
  18. alert("会吃");
  19. };
  20. }
  21.  
  22. function Dog(name,age){
  23. Animal.apply(this, [name,age]);
  24. }
  25.  
  26. var jack=new Dog("jack",1);
  27. alert(jack.name);
  28. alert(jack.age);
  29. jack.shout();
  30. jack.action();
  31. </script>
  32. </body>
  33. </html>

  2、原型继承方式实现继承

  原型继承是js中最通用的继承方式,不用实例化对象,通过直接定义对象,并被其他对象引用,这样形成的一种继承关系,其中引用对象被称为原型对象。

  1. function A(){
  2. this.color = 'red';
  3. }
  4. function B(){}
  5. function C(){}
  6. B.prototype = new A();
  7. C.prototype = new B();
  8. // 测试原型继承
  9. var c = new C();
  10. console.log(c.color); // red

原型继承显得很简单,不需要每次构造都调用父类的构造函数,也不需要通过复制属性的方式就能快速实现继承。但它也存在一些缺点:

① 每个类型只有一个原型,所以不支持多重继承(即一个子类继承自多个父类)。
② 不能很好的支持多参数或动态参数的父类,显得不够灵活。

③ 占用内存多,每次继承都需要实例化一个父类,这样会存在内存占用过多的问题。

4、JavaScript实现多态特性

  JS的函数重载
  这个是多态的基础,JS函数不支持多态,事实上JS函数是无态的,支持任意长度,类型的参数列表。如果同时定义了多个同名函数,则以最后一个函数为准。

  1、js不支持重载,通过判断参数的个数来模拟重载的功能。

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

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

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>Insert title here</title>
  8. </head>
  9. <body>
  10. <script type="text/javascript">
  11. function Animal(){
  12. this.say=function(){
  13. alert("我是动物");
  14. };
  15. }
  16.  
  17. function Dog(){
  18. this.say=function(){ //多态的实现需要重写父类对象的方法
  19. alert("我是狗");
  20. };
  21. }
  22. Dog.prototype=new Animal();//多态的实现需要原生继承
  23.  
  24. function Cat(){
  25. this.say=function(){ //多态的实现需要重写父类对象的方法
  26. alert("我是猫");
  27. };
  28. }
  29. Cat.prototype=new Animal();
  30.  
  31. function say(animal){
  32. if(animal instanceof Animal){
  33. animal.say();
  34. }
  35. }
  36.  
  37. var dog=new Dog();
  38. var cat=new Cat();
  39. say(dog);
  40. say(cat);
  41. </script>
  42. </body>
  43. </html>

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

JavaScript面向对象的三大特性的更多相关文章

  1. JavaScript中面向对象的三大特性(一个菜鸟的不正经日常)

    经过几天的学习,把jQuery给啃会了,但是运用的还不算特别熟练,总感觉自己在JavaScript方面的基础十分欠缺,所以继续拾起JavaScript,开始更好的编程之旅~ 今天学的是JavaScri ...

  2. 谈谈Java面向对象的三大特性

    Java面向对象的三大特性就是指封装.继承.多态了. 一.封装: 概念:封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式. (举例:笔记本电脑就是一个封装体,Java语言中最小的封装体就是函数 ...

  3. oc语言--面向对象的三大特性

    一.封装 1.什么是封装 在程序上,隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将对象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的 ...

  4. OC面向对象的三大特性

    一.面向对象的三大特性:封装(成员变量).继承和多态 1. set方法和get方法 1. set方法和get方法的使用场合 @public的成员可以被随意赋值,应该使用set方法和get方法来管理成员 ...

  5. java基础笔记(6)----面向对象的三大特性

    简介:面向对象的三大特性就是封装,继承,多态,是面向对象的核心. 封装 简介:封装是类的边界,可以对数据起到保护作用 特性:属性私有,提供公开的get/set方法 属性私有:private 数据类型 ...

  6. C#基础知识之面向对象以及面向对象的三大特性

    在C#基础知识之类和结构体中我详细记录了类.类成员.重载.重写.继承等知识总结.这里就记录一下对面向对象和面向对象三大特性的广义理解. 一.理解面向对象 类是面向对象编程的基本单元,面向对象思想其实就 ...

  7. Python面向对象3:面向对象的三大特性

    面向对象的三大特性- 封装- 继承- 多态1 封装 - 封装就是对对象的成员进行访问限制- 封装的三个级别: - 公开,public - 受保护的,protected - 私有的,private - ...

  8. python 之面向对象的三大特性

    面向对象的三大特性 继承 继承和组合 继承进阶 封装 封装(有待完善) 多态 多态

  9. Python 面向对象(创建类和对象,面向对象的三大特性是指:封装、继承和多态,多态性)

    概念:                                                                                                 ...

随机推荐

  1. npm报错没有权限

    在npm install经常会报错没有权限 这个时候需要清除一下缓存 npm cache clean --force

  2. Genius ACM

    题解: 发现匹配一定会选最大和最小匹配,确定左右端点之后nlogn排序后算 比较容易想到二分 最坏情况每次1个 $n^2*(logn)^2$ 没错暴力的最差复杂度是$n^2*logn$的 发现长度与次 ...

  3. 【BZOJ3697】采药人的路径

    题解: 比较简单的点分治 首先暴力的话直接枚举 然后枚举另一个点的时候顺便看一下有没有零点 n^2 考虑点分治 分治之后用f[i][0/1]表示权值为i,有没有零点的方案数 我们来证明一件事情,如果两 ...

  4. [转]EndNote导入IEEE文献的方法

    EndNote导入IEEE文献的方法.IEEE虽然可以批量导出,但是批量导出的是CSV格式.如果想导入到EndNote,需要一个个文献的导入.本文介绍一下IEEE导出文献并导入到EndNote的方法. ...

  5. eclipse4.2版本下面安装ADT,安装已经完成了,但没有ADT的那个图标显示

    如果安装过程没错,直接在Eclipse ->window->customize Perpective->Command Groups Availability 勾选andorid 选 ...

  6. 根据关键字找进程id

    #!/usr/bin/pythonimport subprocessimport sysimport loggingimport os gameproc = "jd_5.py" d ...

  7. ubuntu系统查看已安装的软件

    1.查看安装的所有软件 dpkg -l 例如:dpkg -l | grep ftp 2.查看软件安装的路径 dpkg -L | grep ftp 也可以用 whereis ftp 3.查看软件版本 a ...

  8. Hbase的写入负载均衡

    在写Hbase的时候,会担心数据分布在各个region上不均匀(与预分区无关): 这个时候可能想到的方式:hash.加盐等(当然是可以的,但是读取的时候咋办呢? 哪天写一个这样的文章) 本文采用新方式 ...

  9. Codeforces 356D Bacterial Melee dp

    Bacterial Melee 我们发现所有合法串都是原序列的某个子序列(这个子序列相邻元素相等) 的扩展, 比如子序列为abc, 那么aabbbc, abbbcc 等都是合法串. 所以我们只需要dp ...

  10. springmvc+ajax——第三讲(post请求)

    在ajax01.html中增加个input标签: 在ajax的js中增加: 在controller中仍然使用getParamter():