zoukankan      html  css  js  c++  java
  • javascript基础---面向对象

    1.类的创建方法

    构造器创建类

    用构造器创建类 实际上是用函数实现的。

    形式:function 类名(){

    定义属性的方法 this.age=age;

    定义方法的方法:this.methed=function (){}

    }

    (2)使用prototype属性定义属性和方法,prototype属性是定义类时自动生成的。类名.prototype={},prototype属性可以为类添加成员。

    注意:没有返回值,类名首字母最好要大写,可以带参数

          可以通过  类名.constructor获取类的构造器。这个只可以是对自定义类,而对于宿主类是不可以的,因为宿主类的业务逻辑被隐藏啦,返回的是宿主对象。

    2.类创建实例

      (1)通过new 创建类,然后类中的属性和方法可以通过.号和[]来获得。

      (2)object类的实例可以通过 object obj={}来定义,其中的属性和方法可以定义时赋值,如 object obj={radius :3;area:5;}

              Array 类同样可以 Array array=[],同样可以定义时赋值。

    3.this关键字

      定义类的方法和属性,如果是直接定义 是私有变量仅能在类中使用

    注意:(1)闭包方法中的this关键字,闭包中的this 不能确保this关键字总是引用在其中定义了方法的类和对象。

    eg:

    function warp(){
    	function HelloWorld(){
    	var temp='abc';
    	this.B=function(){
    	 return this.A;
    	}
    	this.A=function(){
    	 document.write("temp的本地变量是"+temp);
    	 document.write(this+"<br>");
    	}
    	}
    	var myhello=new HelloWorld();
    	var t=myhello.B()
         t();
         document.write(this);
    }
    

    输出的是本地变量,和window,window。我的理解是:t()调用的时候,可以写成window.t() 所以t()中的this引用都是指向window的

    (2)对于在函数中嵌套另外一个函数,其中 的this都是表示全局对象window.如果想拥有当前的变量,要在外函数上加中间变量,内部函数用中间变量而不是用this。因为this的值在不断的变化。

    eg:

    function Foo(){
    
     Foo.prototype.method=function(){
     	var that=this;
     	function test=function(){
     		alert(that)
     	}
     	test();
     }
    
    }
    var foo=new Foo();
    foo.method();
    

      (3)使用new创建实例,和直接调用构造函数

    用new创造实例,时this是指向类的,

    如果是用构造函数直接调用的话,this关键字就不会代表该类的实例,是指向全局对象window。

    4.成员访问控制

    公有成员:用this和prototype两种方式定义的方法和属性都是公共属性和方法。this.t=a;可以在类中访问,也可以在实例和之类中访问。

    私有成员:是普通定义的 如:var t=a; 私有成员表示这个成员只能在类中被访问,不能在实例和继承之类中被访问。被访问的方式也是直接调用,不能使用this调用。

    function Foo()
    {
    
    	this.age;//公有属性
    	this.eat=function(){}//公有方法
    	var height();//私有属性
    	var like=function(){}//私有方法
    	function likepeople(){}//私有方法
    }
    

    5.继承--原型链继承,使用原型达到继承的效果

     (1) 方式:function people(){}

         function man(){}

    man.prototype=new people //man的prototype 属性实现继承,继承了people实例中的方法和属性。

       (2)之类要传参数给自己。

         function man(a,b){

         this.age=a;

          this.heigh=b;

        }

        man.prototype=new people //man的prototype 属性实现继承,继承了people实例中的方法和属性。

          (3)之类传参数给父类

     function man(a,b){

      this.$super=people;

      this.$super(a,b);

    }

    man.prototype=new people //man的prototype 属性实现继承,继承了people实例中的方法和属性。

     6.静态成员定义和调用

    (1)什么时候用静态成员:成员是属于类的,不会生成一个实例就生成一个变量。

     (2)定义方式:

    function Foo(){}

    Foo.age=10;

    Foo.method=function(){}

    (3)如何调用

    调用属性:用类名.属性名、

    调用方法:类名.方式名

    eg:Foo.age=20; Foo.method();

    (4)注意:类方法中不能使用this,因此不能使用非静态成员,只能使用静态成员。

                 可以定义同名的静态成员和非静态成员。因为他们访问方式和存储方式不同。

    当一个类中的所有属性和方式都是静态的时候,这个类就是静态类。

    7.重载和覆盖(静态方法和属性是不可以被继承和重载的)

    (1)javascript中的重载和C++中的重载有区别,因为在javascript中不允许出现相同名称的方法;重载的方法是通过在函数中根据arguments的length和typeof运算符进行判断当前函数调用时的参数个数和参数类型

    function overLoad(){}
    overLoad.prototype.method=function(){
    	var len=arguements.length;
    	if(len==2)
         {
         	执行代码
         }
         if(len==3)
         {
         	if(typeof (arguements[0])=='Number'&&typeof (arguements[1])=='Number')
         	{
         		执行代码
         	}
         }
    }
    

      (2)重写(一般情况下无需覆载属性)

    方法覆载的方式:为之类新定义一个同名的成员方法,就能实现类中方法的覆载。

    属性覆载的方式:基类中用this 和prototype定义的属性不可以被覆载,而用set get方法定义的属性可以被覆载。

  • 相关阅读:
    linux 查找最后几条数据
    O(n) 取得数组中每个元素右边最后一个比它大的元素
    O(n) 取得数组中每个元素右边第一个比它大的元素
    位运算实现整数运算
    随手练——P1141 01迷宫
    迷宫寻路问题全解
    N皇后问题 各种优化
    八数码问题(三种解决办法)
    随手练——Uva-11584 划分成回文串(区间DP)
    【2016蓝桥杯省赛】试题C++ B组试题
  • 原文地址:https://www.cnblogs.com/xuruweb/p/4104405.html
Copyright © 2011-2022 走看看