好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

面向对象

面向对象

javascript学习笔记[6]--面向对象

         今天又是宅在家中一天,看了面向对象编程,包含以下几个章节,创建类和使用类,类成员访问控制,继承和组合,静态成员和静态类,多态,原型链本质论。因为已经有了学习其他面向对象语言的经历,所以这边看的速度快了点,预计明天开始进入javascript内建类。

         有一件略微忧伤的事,昨天写的学习笔记【5】--函数2被博客园移出首页了,估计是那管理员看我一天发了三篇随笔,而且深度不够吧,所以看不下去了,却弄得我好忧伤,好忧伤,好了,这一节就尽量写的长一点,然后多一些自己的理解吧,简单的知识就不说了,哎,这种学习性的东西其实就是这样。。

          6.1面向对象--基础概念

               这里我不仔细说了,就罗列一些基础知识点:

               对象,实例,类(对象时类的实例)

               优点:可重用,易维护

               基本特征:封装,继承,多态(类一个方法多种形态),(抽象)

          6.2 创建类--构造器方法

                使用函数创建类,函数本身也被称为该类的构造器(也称为构造器方法,构造方法)。

               javascript是基于原型的面向对象---- important .

View Code

             实例化就用new,Object,Array不需要使用new关键字就可以实例化。

         6.3 定义方法和属性

            1)this关键字 ---看上面的代码就是通过this定义属性(其实用this关键字的时候很容易犯错误,尤其是又有闭包函数,这边如果记得的话在总结一篇)

            2)prototype定义

View Code

 function   Person(){
    this  .name;
    this  .age;
    this .showInfo =  function  (){
          return  "我的名字是"+ this .name+"我现在"+ this .age+"岁。" ;
  }
}
  var   tom =  new   Person();
tom.name  = "Tom" ;
tom.age  = 22 ;
  var  info =  tom.showInfo();
document.write(info +"<br />");

            3)Object类,return扩展

                 Object类直接定义一个实例,并为该对象赋属性和方法,很好的体现了javascript名值对的概念。见如下代码

View Code

 //  prototype定义方法,属性也类似 
 function   Person(myName,myAge){
     this .name =  myName;
     this .age =  myAge;
}
Person.protoype.showInfo  =  function  (){
     return  "name = "+name+",age = "+ age;
};
   //  prototype另一个重要作用就是为类添加新成员 
  function   showDetail(){
         return  "我是一只菜鸟" ;
 }
 Person.prototype.showDetail  =  showDetail;
   var  person =  new  Person("tony",22 );
 document.write(person.showDetail()); 

              下面是用return语句定义方法和属性,还有使用prototype和Object配合定义方法和属性

View Code

 var  person =  {
name:  "tony" ,
age:  22 ,
showInfo:   function  (){
        return  "name="+name+",age="+ age;
  }
}
document.write(person.showInfo()); 

        6.4 使用get和set存取器---java中的get,set方法相同

        6.5类和成员访问控制---public和private变量

        6.6 继承和组合

               继承:记住Child.prototype = new Father(),这就实现了继承,那些关于使用基类的构造器方法,实现其他语言中super方法就可以了。

             组合:记住把手,腿,头等其他部件组成人,这就是组合的思想,具体代码就不贴了,就是在组合的类中(人)实现方法中新建一个手,然后使用手的方法。

             这里有个概念,is-a和has-a。is-a是属于概念,has-a是包含概念。

         6.7 静态成员,静态类和枚举

               静态类:就是对比于现实中那些独一无二的东西。世界上就有一个月亮,所以它可以定义为一个静态类。如果想把成员声明为静态,只需将属性或者方法赋给类本身。就这样。还有一些注意事项就不说了。

         6.8 多态--重载和覆盖

               一个类中有多个方法名相同的方法---重载,但是在javascript中不支持直接定义多个方法来实现重载,下面的代码利用arguments.length判断参数个数,typeof判断参数类型来实现重载

View Code

 function   Person(myName,myAge){
   return  {
        name:  myName,
        age: myAge,
        showInfo:   function  (){
          return  "name = "+name+",age = "+ age;
      }
   }
}


  //  prototype和Object配合为类定义方法和属性 
 function   Person(){}
Person.prototype  =  {
                name:   "tony" ,
        age:  22 ,
        showInfo:   function  (){
             return  "name = "+name+",age = "+ age;
        }
}; 

 function   overLoadTest(){
      var  len =  arguments.length;
      if (len == 2 ){
          if ( typeof (arguments[0]) =="number" &&  typeof (arguments[1]) == "number" ){
              //  执行函数 
        } else   if ( typeof (arguments[0]) =="string" &&  typeof (arguments[1]) == "string" ){
            
        }  else  {
              throw   new  Error("两个参数类型不对" );
        }
    }
      if (len == 3 ){
          if  (){
        }  else   if  (){
            
        }  else  {
            
        }
    }
} 

             在新类中覆盖基类的方法---覆盖,只需要为子类新定义一个同名的方法成员即可实现覆盖。就不写代码了。

         6.9 原型链本质论-----重点

              这里我也有很多东西不知道,所以多写一些,大家一起学习吧。知识点如下:

              每个类都有一个prototype属性(静态属性),该属性值标示该类的一个对象,即原型对象。

             原型对象上定义的属性中就有关于基类的信息,然后基类上的prototype也有它的基类信息,这样就建立了一个链条----原型链(prototype chain)--继承关系引起的

             原型链的尽头是Object的原型对象,该对象的内部prototype的值为null。

             ECMA-262规定:类定义的时候,它有原型对象,包好一些内部特定的属性,作为类的特性,其中两个内部属性就是【prototype】(该类的父类的原型对象)和【class】(类名)。在非ie浏览器中可以用_proto_访问,例如:

            Array.prototype._proto_ == Object.prototype.

           原型链的组成部分:实现继承和分享属性(看一下上面的代码就知道了)

            下面是几个方法:

            Object.getPrototypeOf()方法等到指定对象的prototype属性,替代_proto_属性

            Class.prototype.isPrototype(object),查看对象是否在指定对象的原型链中。

            oObject.hasOwnProperty(propName),查看指定对象是否定义了特定属性

            Object.propertyIsEnumerabel(),查看指定的属性是否存在以及是否可枚举。

            就这些吧,挺晚了。明天继续。

  以上全部都属个人原创,请大家转载的时候附上原创链接:  http://www.cnblogs.com/tonylp

 

 

分类:  javaScript

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于面向对象的详细内容...

  阅读:35次