javascript面向对象3

发布时间:2019-07-11 09:47:18编辑:auto阅读(1465)

    函数
    创建函数:
    function f(x){…..};
    var f = function(x){…};
    上面两种形式都可以创建名为f()的函数,不过后一种形式可以创建匿名函数。
           函数定义时可以设置参数。如果传给函数的参数个数不够,则从最左边起依次对应,其余的用undefined赋值,如果传给函数的参数多于函数定义参数的个数,则多出的参数被忽略。
           JS代码:(见附件test1.html)
                  function myprint(s1,s2,s3){
                         alert(s1 + "_" + s2 + "_" + s3);
                  }
          
                  //undefined_undefined_undefined
                  myprint();   
                  //String1_String2_undefined
                  myprint("String1","String2");   
                  //String1_String2_String3
                  myprint("String1","String2","String3","String4");
     
           因此,对于定义好的函数,我们不能指望调用者将所有的参数全部传进来,对于那些必须用到的参数应该在函数体中加以检测(!操作符),或者设置默认值然后同参数进行或(||)操作来取得参数。
           JS代码:(见附件test2.html)
                  function myprint(s1,person){
                         //默认person对象
                         var defaultPerson = {
                                "name":"name1",
                                "age":18,
                                "sex":"female"
                         };
                 
                         //s1不允许为空
                         if (!s1)
                         {
                                alert("s1 must be input");
                                return false;
                         }
     
                         //接受person对象
                         person = person || defaultPerson;
                         alert(s1 + "_" + person.name + ":" + person.age + ":" + person.sex);
                  };
     
                  //s1 must be input
                  myprint();  
                  //s1_name:18:female
                  myprint("s1");
                  //s1_wangsy:31:male
                  myprint("s1",{"name":"wangsy","age":31,"sex":"male"});
     
           函数的armuments属性
           在每一个函数体的内部,都有一个arguments标识符。这个标识符代表了一个Arguments对象,Arguments对象非常类似于Array(数组)对象,比如都有length属性,访问它的值用”[]”操作符,利用索引来访问参数值,但是,二者是完全不同的东西,仅仅是表面上有共同点而已(比如说修改Arguments对象的length属性并不会改变它的长度)
           JS代码:(见附件test3.html)
                  function myargs(){
                         alert(arguments.length);
                         alert(arguments[0]);
                  }
     
                  //0  undefined
                  myargs();
                  //2  1
                  myargs("1",[1,2]);
     
           Arguments对象有一个callee属性,标示了当前Arguments对象所在的方法,可以使用它来实现匿名函数的内部递归调用。
           JS代码:(见附件test4.html)
                  function (x){
                         if (x <= 1) return 1;
                         return x*Arguments.callee(x-1);
                  }
          
    method--方法
           方法就是函数,我们知道,每一个对象都包含0个或多个属性,属性可以是任意类型,当然也包括对象。函数本身就是一种对象,因此我们完全可以把一个函数放到一个对象里面。此时,这个函数就成了对象的一个方法。此后如果要使用该方法,则可以通过对象名利用”.”操作符来实现。
           JS代码:(见附件test5.html)
                  var obj = {f0:function(){alert("f0");}};
     
                  function f1(){
                         alert("f1");
                  }
                  //为对象添加方法
                  obj.f1 = f1;
     
                  //f0 f0obj的方法
                  obj.f0();
                  //f1 f1obj的方法
                  obj.f1();
                  //f1 f1同时又是一个函数,可以直接调用
                  f1();
                  //缺少对象 仅仅是obj的方法,只能通过对象调用
                  f0();
     
           方法的调用需要对象的支持,那么在方法中如何获取对象的属性呢?this!this关键字我们已经很熟悉了,在js方法中,我们可以用this来取得对方法调用者(对象)的引用,从而获取方法调用者的各种属性。
           JS代码:(见附件test6.html)
                  var obj = {"name":"NAME","sex":"female"};
                  //为对象添加方法
                  obj.print = function(){
                         alert(this.name + "_" + this["sex"]);
                  };
     
                  //NAME_female
                  obj.print();
                  obj.sex = "male";
                  //NAME_male
                  obj.print();
     
           下面来一个更加面向对象的例子:
           JS代码:(见附件test7.html)
                  var person = {
                         name:"defaultname",
                         setName:function(s){
                                this.name = s;
                         },
                         "printName":function(){
                                alert(this.name);
                         }
                  };
                  //defaultname
                  person.printName();
                  person.setName("newName");
                  //newName
                  person.printName();
     
           在上面的例子中,完全可以用person.name = …来直接改变personname属性。另一种改变person属性的方法就是:定义一个function,接收两个参数,一个是person,一个是name的值,看起来像是这样:changeName()person,”newName”),哪种方法好呢?很明显,例子中的方法更形象,更直观一些,而且好象有了那么一点面向对象的影子。

关键字