建站学 - 轻松建站从此开始!

建站学-个人建站指南,网页制作,网站设计,网站制作教程

详解JavaScript中具名函数的几种调用方式(2)

时间:2011-04-03 14:47来源: 作者: 点击:
下面我们以函数中有无this来讨论。没有this时返回一个空的对象{},有this时返回一个非空对象。 下面是一个没有this的函数 01 // 返回值是基本类型 02 function fun() { 03 return jack ; 04 } 05 06 var c = new fun

下面我们以函数中有无this来讨论。没有this时返回一个空的对象{},有this时返回一个非空对象。

下面是一个没有this的函数

01 // 返回值是基本类型
02 function fun() {
03     return "jack";
04 }
05   
06 var c = new fun();
07 for (var atr in c) {
08     alert(atr);
09
10 alert(c); //[object Object]

返回值c不是"jack", 从for in执行后没有输出任何属性可以看出 c 是一个空的对象{}。

再看看有this的函数,函数中有this实际上是在写一个类。但由于js的灵活性,造成了许多诡异的写法。

01 // 返回值是基本类型
02 function fun() {
03     this.name = "tom";
04     return "jack";
05 }
06   
07 var c = new fun();
08 for (var atr in c) {
09     alert(atr); //name
10
11 alert(c.name); //tom

返回值也不是"jack",for in输出了name属性,最后一句输出了tom,说明返回值 c 是一个非空对象。这里的return "jack"压根没起作用。所以当函数返回值是内置类型(基本类型)时,用new方式调用函数将会导致错误的结果 。

那么当函数返回值是一个对象,数组,函数呢?

01 // 不含this,返回值是一个对象
02 function fun() {
03     //组装一个对象
04     var obj = {};
05     obj.name = 'andy';
06     obj.age = 20;
07     obj.msg = function(){}  
08     return obj;
09 }
10   
11 var c = new fun();
12 for (var atr in c) {
13     alert(atr); //name,age,msg
14
15 alert(c.name); //andy


01 // 含this,返回值是一个对象
02 function fun() {
03     this.sex = "man";
04     //组装一个对象
05     var obj = {};
06     obj.name = 'andy';
07     obj.age = 20;
08     obj.msg = function(){}  
09     return obj;
10 }
11   
12 var c = new fun();
13 for (var atr in c) {
14     alert(atr); //name,age,msg
15
16 alert(c.name); //andy<BR>

两段的输出结果是一样的,c都含有name,age,msg属性而不含sex属性。说明当返回值是对象类型(对象,数组,函数)时,new不会用this去构造对象,而直接返回组装的对象。 

这种方式实际上是工厂方式,在应用中更多的程序员把函数名首字母大写,让它看起来更像一个类。

01 /**
02  * 定义一个函数Car
03  */
04 function Car(color,doors) { 
05     var car = {};
06     car.color = color;
07     car.doors = doors;
08     car.msg = function(){ 
09         alert("This is a " + this.color + " car, there are " + this.doors + " doors." );
10     }   
11     return car;
12 }

定义了函数Car,函数内创建了一个空对象,添加了一些属性和方法后返回。  以下是两种创建方式

1 // 方式1
2 var c1 = Car('red',2);
3 c1.msg();
4   
5 // 方式2
6 var c2 = new Car('black',4);
7 c2.msg();

方式1是函数调用,方式2是new。方式2把Car当成了一个类,但实际上并不是(Car的this和prototype都未挂属性,方法)


(责任编辑:admin)
织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片