一、构造函数
基本用法:
function 类名(参数列表){
属性=参数值
}

  1. function Person(name,age){
  2. this.name = name;
  3. this.age = age;
  4. }
  5.  
  6. //创建Person对象的时候,可以直接给名字和年龄
  7. var p1 = new Person('abc',80);
  8. window.alert(p1.name);
  9. var p2 = new Person('hello',9);
  10. window.alert(p2.name);
  11.  
  12. //在给一个对象初始化普通属性值的时候,也可以指定函数属性
  13.  
  14. function jiSuan(num1,num2,oper){
  15. if(oper=="+"){
  16. return num1 + num2;
  17. }else if(oper=="-"){
  18. return num1 - num2;
  19. }else if(oper=="*"){
  20. return num1 * num2;
  21. }else{
  22. return num1 / num2;
  23. }
  24. }
  25.  
  26. function Person(name,age,fun){
  27. this.name = name;
  28. this.age =age;
  29. this.myfun = fun;
  30. }
  31.  
  32. //创建对象时,不仅要可以初始化变量,还可以初始化一个函数
  33. var p1 = new Person("aa",9,jiSuan);
  34. window.alert(p1.myfun(90,89,"+"));

二、创建对象的有一种形式【加强篇】

2.1 JSON创建对象

  1. //如果一个对象比较简单,我们可以直接创建。(可以指定普通属性和函数)
  2. var dog ={name:'小狗',age:8};
  3. window.alert(dog.constructor);
  4. window.alert(dog.name + dog.age);
  5.  
  6. //扩展:
  7. var dog = {name:'小狗',
  8. age:8,
  9. fun1:function(){window.alert('hello,world');},
  10. fun2:function(){window.alert('okok');}
  11. };
  12. window.alert(dog.constructor);
  13. window.alert(dog.name + dog.age);
  14. dog.fun1();
  15. dog.fun2();
  16.  
  17. //有时,我们看到这样一种调用方法,函数名.call(对象实例)
  18. //这样调用,该函数的this就是对象实例
  19. var dog ={name:'hello'};
  20. function test(){
  21. window.alert(this.name);
  22. }
  23. test();
  24. window.test();
  25. //这两个方法都打印出undefine
  26. test.call(dog); //<==>dog.test();

2.2 使用for...in 遍历

  1. var dog= {name:'小明',sayHello:function(a,b){window.alert("结果="+(a+b));}};
  2. //循环列出dog对象的所有属性和方法 对象名['属性名']
  3. for(var key in dog){
  4. window.alert(dog[key]);
  5. }
  6.  
  7. //document.write("****当前浏览器window对象所有属性和方法****<br/>");
  8. for(var key in window){
  9. document.writeln(key+":"+window[key]+"<br/>");
  10. }

三、JS面向对象的三大特性:继承、封装和多态

3.1 封装

  js提供有以下几种控制方法和属性的访问权限:
    (1) 公开级别:对外公开
    (2) 私有级别:类本身可用访问,不对外公开。

  1. function Person(name,agei,sal){
  2. this.name = name; //公开的属性
  3. var age=agei; //私有属性
  4. var salary=sal; //私有属性
  5. //在类中如何定义公开方法(特权方法),私有方法(内部方法)
  6. //如果我们希望操作私有的属性,则可用公开方法实现
  7. this.show=function(){
  8. window.alert(age+" "+salary);
  9. }
  10.  
  11. //私有方法
  12. function show2(){
  13. window.alert(age+" "+salary);
  14. }
  15. show2();
  16. }
  17.  
  18. var p1 = new Person('sp',20,50000);
  19. window.alert(p1.name+" "+p1.age);
  20. p1.show(); //这个可以ok
  21. //p1.show2(); //不能在类的外部使用私有的方法
  1. //注意:通过prototype给所有的对象添加方法,但是这种方式,不能去访问类的私有变量和
  2.  
  3. //方法
  4. //举例:
  5. function Person(){
  6. this.name = "abc";
  7. var age=90;
  8. this.abc=function(){
  9. window.alert("abc()");
  10. }
  11.  
  12. function abc2(){
  13. window.alert("abc2");
  14. }
  15. }
  16.  
  17. Person.prototype.fun1 =function(){
  18. window.alert(this.name); //ok
  19. //window.alert(age); //no ok 私有变量
  20. //abc2(); //no ok 私有方法
  21. //window.alert(age); //no ok 私有变量
  22.  
  23. }
  24.  
  25. var p1 = new Person();
  26. p1.fun1();

3.2 继承

A、为什么需要继承

  1. function MidStu(name,age){
  2. this.name=name;
  3. this.age = age;
  4. this.show =function(){
  5. window.alert(this.name +" "+this.age);
  6. }
  7. //计算学费
  8. this.payFee=function(money){
  9. window.alert("应缴" + money * 0.8);
  10. }
  11. }
  12.  
  13. function Pupil(name,age){
  14. this.name=name;
  15. this.age = age;
  16. this.show =function(){
  17. window.alert(this.name +" "+this.age);
  18. }
  19. //计算学费
  20. this.payFee=function(money){
  21. window.alert("应缴" + money * 0.5);
  22. }
  23. }
  24. //上面的代码存在冗余问题
  1. //解决方法可以使用继承(对象冒充来实现继承效果的)
  2.  
  3. //怎么解决代码冗余问题-->继承
  4. //抽象出一个学生类(把小学生和中学生的共性取出)
  5.  
  6. function Stu(name,age){
  7. this.name =name;
  8. this.age =age;
  9. this.show=function(){
  10. window.alert(this.name +" "+this.age)
  11. }
  12. }
  13.  
  14. function MidStu(name,age){
  15. this.stu=Stu;
  16. this.stu(name,age); //js中实际上是通过对象冒充,来实现继承,这句话不能少。
  17.  
  18. //因为js是动态语言,如果不执行,则不能实现继承效果
  19. //MidStu可以覆盖Stu父类的show
  20. this.show=function(){
  21. window.alert("MidStu show();");
  22. }
  23. }
  24.  
  25. function Pupil(name,age){
  26. this.stu = Stu;
  27. this.stu(name,age);
  28. }
  29.  
  30. var midStu = new MidStu("顺平",20);
  31. window.alert(midStu.name);
  32. midStu.show();
  33.  
  34. //特别说明:通过对象冒充,js可以实现多重继承的效果,用的比较少

3.3  js的重载和重写

3.3.1 重载:js中不支持重载(即,不可用通过参数的个数来决定调用哪个函数,但是因为js本身支
持可变参数,所有,它可以看成天然支持重载)

  

  1. function abc(){
  2. if(argument.length=..){
  3. }else if(){
  4. }
  5. }

3.3.2 重写:子类可以重新写函数来覆盖父类的某个方法

  1. //父类
  2. function Stu(name,age){
  3. this.name =name;
  4. this.age =age;
  5. this.show=function(){
  6. window.alert(this.name +" "+this.age);
  7. }
  8. }
  9.  
  10. //子类
  11. function MidStu(name,age){
  12. this.stu=Stu;
  13. this.stu(name,age); //js中实际上是通过对象冒充,来实现继承,这句话不能少。
  14.  
  15. //因为js是动态语言,如果不执行,则不能实现继承效果
  16. //MidStu可以覆盖Stu父类的show
  17. /*this.show=function(){
  18. window.alert("MidStu show();");//这里就会去调用子类的show方法
  19. }*/
  20. }
  21. var midStu = new MidStu("zhangsan",3);
  22. midStu.show();

3.4 多态:一个引用类型在不同情况下的多种状态,在java中多态是指通过父类的引用,来调用在不同子类中实现的方法。js实际上是无态的,是一种动态语言,一个变量的类型是在运行的过程中由js引擎来决定的,所有说,js天生就是支持多态。

  1. function Person(){
  2. this.test1=function(){
  3. window.alert("Person test1");
  4. }
  5. }
  6. function Cat(){
  7. this.test1=function(){
  8. window.alert("Cat test1()");
  9. }
  10. }
  11. var v = new Person();
  12. v.test1();
  13. v = new Cat();
  14. v.test1();

3.4.1 面向对象三大特征案例

  1. function Master(){
  2. //给动物喂食
  3. this.feed =function(animal,food){
  4. document.write("主人给"+animal.name + "喂"+food.name);
  5. }
  6. }
  7.  
  8. //写食物
  9. function Food(name){
  10. this.name =name;
  11. }
  12.  
  13. function Fish(name){
  14. this.food = Food;
  15. this.food(name);
  16. }
  17.  
  18. function Bone(name){
  19. this.food = Food;
  20. this.food(name);
  21. }
  22.  
  23. function Peach(name){
  24. this.food = Food;
  25. this.food(name);
  26. }
  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.  
  48. var cat = new Cat("小猫咪");
  49. var dog = new Dog("小狗");
  50. var fish = new Fish("小鱼");
  51. var bone = new Bone("骨头");
  52.  
  53. var master = new Master();
  54. master.feed(cat,fish);
  55. master.feed(dog,bone);
  56. master.feed(new Monkey("小猴"),new Peach("水蜜桃"));

四、闭包

4.1 解释:

    (1)闭包和gc是相关联的
    (2)闭包实际是涉及到一个对象的属性,何时被gc处理的问题
    (3)怎样才能对对象的属性形成一个闭包

  1. //案例:
  2. function A(){
  3. var i=0;
  4. function b(){
  5. window.alert(i++);
  6. }
  7. return b;
  8. }
  9. var c =A(); //执行完A函数后,i的值已变成1,然后把b的构造函数赋值给c,但是i在A函数中,虽然A已执行完,但是i没有被立即回收,而是在C函数中继续执行,这样i就被闭包了。
  10. c();
  11. /*闭包的作用就是在a执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源,因为a的内部函数b的执行需要依赖于a中的变量i*/

分析:
//闭包<---->gc
A();//此时内存中会有i的空间被gc处理
var c = A(); //这种用法,gc不会把i当做垃圾
//c();
window.alert("aa");
//..
//..
c(); //输出0;
c(); //输出1;从而证明i变量被闭包

JavaScript基础--面向对象三大特性(八):继承封装多态的更多相关文章

  1. python面向对象三大特性之一继承、多态、封装

    继承,即在定义一个类时,以另一个类为参数,则称这个新定义的类继承了参数类,父类又称为基类. 单继承表示只继承一个类,多继承表示继承多个类. class parent1: pass class pare ...

  2. Java第四次作业——面向对象高级特性(继承和多态)

    Java第四次作业--面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能, ...

  3. Java第四次作业,面向对象高级特性(继承和多态)

    Java第四次作业-面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能,说 ...

  4. Java第四次作业—面向对象高级特性(继承和多态)

    Java第四次作业-面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能,说 ...

  5. JAVA基础——面向对象三大特性:封装、继承、多态

    JAVA面向对象三大特性详解 一.封装 1.概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. 2.好处: 只能通过规定的方法访问数据. ...

  6. 面向对象编程(九)——面向对象三大特性之继承以及重写、Object类的介绍

    面向对象三大特性 面向对象三大特征:继承 :封装/隐藏 :多态(为了适应需求的多种变化,使代码变得更加通用!) 封装:主要实现了隐藏细节,对用户提供访问接口,无需关心方法的具体实现. 继承:很好的实现 ...

  7. PHP面向对象三大特性之一:封装

    面向对象的三大特性:封装.继承.多态 1.封装 封装的目的:让类更加安全,做法是不让外界直接访问类的成员 具体做法:1.成员变为私有:访问修饰符(public.private.protected)   ...

  8. C#面向对象三大特性之一:封装

    面向对象的三大特性:封装.继承.多态. 1.封装概念 封装:每个对象都包含有它能进行操作的所有信息,这个特性称为封装.这样的方法包含在类中,通过类的实例来实现. 2.封装的优点 A.良好的封装能够减少 ...

  9. java面向对象三大特性之继承

    通过重用已经测试并验证通过的代码,怎样才减少开发工作,所有开发团队都在为一问题而努力.一个久经考验的方法是通过有效地使用Java继承优化应用程序开发. 继承的从某种意义上讲,继承的短暂美就如同宇宙中所 ...

随机推荐

  1. s3c2440 移值u-boot-2016.03 第3篇 支持Nor flash 识别

    当选择,NOR flash 启用时,才可以访问 NOR FLASH ./common/board_r.c 364 line:initr_flash()flash_size = flash_init() ...

  2. 32、mybatis

    第一章回顾jdbc开发 1)优点:简单易学,上手快,非常灵活构建SQL,效率高 2)缺点:代码繁琐,难以写出高质量的代码(例如:资源的释放,SQL注入安全性等) 开发者既要写业务逻辑,又要写对象的创建 ...

  3. ipcs命令

    unix/linux下的共享内存.信号量.队列信息管理 在unix/linux下,经常有因为共享内存.信号量,队列等共享信息没有干净地清楚而引起一些问题. 查看共享信息的内存的命令是ipcs [-m| ...

  4. C#预处理器指令

    在C#中有许多名为“预处理指令”的命令,这些命令从来不会转化为可执行代码中的命令,但会影响编译过程的各个方面.例如,使用预处理器指令可以禁止编译器编译代码的某一部分.如果计划发布两个版本的代码,即基本 ...

  5. jQuery 效果 —— 隐藏和显示

    jQuery 效果 -- 隐藏和显示 1.隐藏和显示 (1)在jQuery中我们可以使用hide()和show()分别隐藏和显示HTML元素: //隐藏元素 $("button") ...

  6. Count Primes - LeetCode

    examination questions Description: Count the number of prime numbers less than a non-negative number ...

  7. 【java】定时器

    总结 1.执行计划的任务放在TimerTask的子类中,由Timer进行该任务. 2.创建一个Timer就是启动一个新的线程,直至Timer里的任务执行完毕,才会结束.希望创建的线程为守护线程,则创建 ...

  8. linux下route命令使用实战

    配置路由表: 第一步: sudo route add -net 172.30.6.0 netmask 255.255.255.0 eth0 执行后可以使用命令route -n查看,查看内容如下: 17 ...

  9. sbrk与brk的使用小例子

    sbrk() 和 brk() - Unix的系统函数   sbrk()和brk() 系统的底层会维护一个位置,通过位置的移动完成内存的分配和回收.映射内存时 以一个内存页作为基本单位.   void* ...

  10. html/CSS基础知识回顾

    html部分 块级元素: 一般用来搭建网站架构,布局,装载内容...像这些大体力的活都属于块级元素.它包括以下标签: address,blockquote,center,dir, div, dl, d ...