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)