zoukankan      html  css  js  c++  java
  • JavaScript中的面向对象【四】

    Function 

      有一个内置的构造器函数叫Function(),它允许以另外一种方式创建函数。  

      function sum01(a, b) { return a + b; }
       document.write(sum01(1,2));
    
      var sum02 = function (a, b) { return a + b; } 
      document.write(sum02(1,2));
    
      //注意:Function是大写
      var sum03 = new Function ('a', 'b', 'return a + b;')
      document.write(sum03(1, 2));
    

      如果你用Function 构造器创建函数时有许多的参数,那么传给Function 的时候可以只传一个参数,它们是以一个逗号分隔的列表 

        var sum03 = new Function ('a', 'b', 'return a + b;')
        document.write(sum03(1, 2));
    
        var sum04 = new Function('a, b', 'return a + b;')
        document.write(sum04(1, 2));
    
        var sum05 = new Function('a, b', 'c', 'return a + b + c;')
        document.write(sum05(1, 2, 3));
    

      当用Function()构造器的时候,先传递的数据会作为参数(以字符串),接着是函数体的源代码(也以字符串的形式)。   
      JavaScript引擎就会评估你传过来的源代码并为你创建一个函数。   
      源代码的评估会遭受eval()函数一样的缺点。所以用Function()构造器定义函数应该尽可能的避免(不推荐使用)。

    Function对象的属性

      constructor 属性(“JavaScript中的面向对象【二】”中讲过,所以这里就不讲了)

      length属性:得到的是Function的参数个数

            function myFunction(a, b, c) {
                return a + b + c;
            }
            
            //Function的length属性得到的是Function的参数个数
            alert(myFunction.length);
    

      caller属性:返回调用本函数的函数引用

            //Two()调用了One(),而One()中返回的One调用了caller
            function One() {
                return One.caller;
            }
    
            function Two() {
                return One();
            }
    
            //此时,Two()将返回自己Two();
            alert(Two());
    
            //如果你在全局空间(在任何函数外面)调用One(),则返回null
            alert(One());
    
            //****************************************************************
            //没有调用caller
            function Three() {
                return Three;
            }
    
            function Fore() {
                return Three();
            }
    
            //此时,Fore()将返回调用的函数Three();
            alert(Fore())
    

      prototype属性(请期待以后的文章)

    Function对象的方法

      call()方法:改变this的指向

        如果方法有参数的话: call(this要指向的对象,参数1,参数2...)
        如果方法没有参数的话: call(this要指向的对象)

           var MyFunction = { 
                name:'John',
                run:function(name){
                    alert(this.name + '和' + name + '在跑!')
                }
            }
    
            var OtherFunction = { 
                name:'Jeff'
            }
    
            //call(this要指向的对象,参数1,参数2...)
            //MyFunction.run()方法中的this.name的this在没有调用call方法时是指向了MyFunction
            //但当调用了call方法后,this指向了OtherFunction,所以this.name的值是‘Jeff’
            MyFunction.run('Mary');
            MyFunction.run.call(OtherFunction, 'Mary');
    

      apply()方法:与Call()方法一样,不过它的参数是一个数组

        如果方法有参数的话: apply(this要指向的对象,[ 参数1,参数2... ])     
        如果方法没有参数的话: apply(this要指向的对象)  

           //apply原理与call一样,只不过apply(this要指向的对象,一个参数数组)
            MyFunction.run.apply(OtherFunction, ['MM']);
    

    arguments 对象

      arguments 看上去像一个数组,但实际上它是一个像数组的对象而已。
      它看上去像数组是因为它包含索引化的元素和length属性,然而,相似性也就到此为止了,
      因为arguments没有提供任何数组的方法,如:sort()或者slice()。

      利用arguments对象可以做一个可变参数的函数

            function argDemo() {
                for (var i = 0; i < arguments.length; i++) {
                    document.write(arguments[i]);
                }
            }
    
            argDemo(1);
            argDemo(1,2);
            argDemo(1,2,3);
    

      arguments对象还有另外一个有趣的属性——callee属性。它包含被调用函数的一个引用

            //它包含被调用函数的一个引用。
            //如果你创建了一个函数它返回arguments.callee 并且你调用了这个函数,
            //它只是简单返回一个自己的引用
            function Demo() {
                return arguments.callee;
            }
    
            alert(Demo());
    

      我们再看下面的例子: 

           //arguments.length是实参长度,arguments.callee.length是形参长度
            function calleeLengthDemo(arg1, arg2) {
                if (arguments.length == arguments.callee.length)
                    alert('实参长度等于形参长度');
                else
                    alert('实参长度:' + arguments.length + '  形参长度:' + arguments.callee.length)
            }
    
            //实参长度等于2,形参长度等于2
            calleeLengthDemo(1, 1);
            //实参长度等于3, 形参长度等于2
            calleeLengthDemo(1, 1, 1);
    

    Error对象

    •  JavaScript 提供了try,catch 和finally 以帮助处理错误。如果一个错误发生,一个错误对象会抛出。
    •  Error 对象通过这几个内置的构造器之一来创建:EvalError,RageError,ReferenceError,SyntaxError,TypeError,URIError。
    •  所有的这些构造器都继承于Error 对象。

      我们看下面的例子

           function MyFunction() {
                this.style.color = 'gray';
            }
    
            try{
                MyFunction();  
            }
            catch (e) {      
                //e.name 包含用来创建错误对象的构造器的名字
                //e.message 错误信息
                alert(e.name + '  ' + e.message);
            }
    

      上面的例子是获取的是系统的错误信息,下面我们抛出我们定义的错误信息。

      有两种方式: 

           //抛出一个Error对象
           throw new Error(‘ code… ’)
           //抛出一个对象,里面包含name属性和message属性
        throw {
          name:’  code… ’,
          message:’ code… ’
        }
    

      我们看一下这两种方式的例子:

      抛出一个Error对象

              function ThrowDemo(num) {
                try {
                    if (num === 0) {
                        throw new Error('Error:输入信息有误!');
                    }
                    else {
                        alert(num);
                    }
                }
                catch (e) {
                    alert(e.name + " : " + e.message);
                }
                finally {
                    alert('finally');
                }
            }
    
            ThrowDemo(0);
    

      抛出一个对象,里面包含name属性和message属性  

            function ThrowObjectDemo(num) {
                try {
                    throw {
                        name:'Error',
                        message:'有错误!'
                    }
                }
                catch (e) {
                    alert(e.name + " : " + e.message);
                }
            }
    
            ThrowObjectDemo(0)
    

      

  • 相关阅读:
    Centos系统下载
    Centos7 安装 docker
    Centos6 安装 docker
    yum提示Another app is currently holding the yum lock; waiting for it to exit...
    Oracle 时间字段显示不正确,类型错误
    Android 报错:error: too many padding sections on bottom border
    vs文件上传失败--超过最大字符限制
    ButterKnife 牛油刀使用
    VS项目发布到本地IIS
    Visual Studio无法调试
  • 原文地址:https://www.cnblogs.com/xinlingblog/p/2421904.html
Copyright © 2011-2022 走看看