javascript面向对象3

2023-01-31 01:01:51 javascript 面向对象
函数
创建函数:
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 f0是obj的方法
              obj.f0();
              //f1 f1是obj的方法
              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 = …来直接改变person的name属性。另一种改变person属性的方法就是:定义一个function,接收两个参数,一个是person,一个是name的值,看起来像是这样:changeName()person,”newName”),哪种方法好呢?很明显,例子中的方法更形象,更直观一些,而且好象有了那么一点面向对象的影子。

相关文章