JavaScript中具名函数的多种调用方式(2)
2011-03-05 16:15
489 查看
以函数中有无this来讨论。没有this时返回一个空的对象{},有this时返回一个非空对象。
下面是一个没有this的函数
返回值c不是"jack", 从for in执行后没有输出任何属性可以看出 c 是一个空的对象{}。
再看看有this的函数,函数中有this实际上是在写一个类。但由于js的灵活性,造成了许多诡异的写法。
返回值也不是"jack",for in输出了name属性,最后一句输出了tom,说明返回值 c 是一个非空对象。这里的return "jack"压根没起作用。所以当函数返回值是内置类型(基本类型)时,用new方式调用函数将会导致错误的结果 。
那么当函数返回值是一个对象,数组,函数呢?
两段的输出结果是一样的,c都含有name,age,msg属性而不含sex属性。说明当返回值是对象类型(对象,数组,函数)时,new不会用this去构造对象,而直接返回组装的对象。
这种方式实际上是工厂方式,在应用中更多的程序员把函数名首字母大写,让它看起来更像一个类。
定义了函数Car,函数内创建了一个空对象,添加了一些属性和方法后返回。
以下是两种创建方式
方式1是函数调用,方式2是new。方式2把Car当成了一个类,但实际上并不是(Car的this和prototype都未挂属性,方法)
下面是一个没有this的函数
// 返回值是基本类型 function fun() { return "jack"; } var c = new fun(); for (var atr in c) { alert(atr); } alert(c); //[object Object]
返回值c不是"jack", 从for in执行后没有输出任何属性可以看出 c 是一个空的对象{}。
再看看有this的函数,函数中有this实际上是在写一个类。但由于js的灵活性,造成了许多诡异的写法。
// 返回值是基本类型 function fun() { this.name = "tom"; return "jack"; } var c = new fun(); for (var atr in c) { alert(atr); //name } alert(c.name); //tom
返回值也不是"jack",for in输出了name属性,最后一句输出了tom,说明返回值 c 是一个非空对象。这里的return "jack"压根没起作用。所以当函数返回值是内置类型(基本类型)时,用new方式调用函数将会导致错误的结果 。
那么当函数返回值是一个对象,数组,函数呢?
// 不含this,返回值是一个对象 function fun() { //组装一个对象 var obj = {}; obj.name = 'andy'; obj.age = 20; obj.msg = function(){} return obj; } var c = new fun(); for (var atr in c) { alert(atr); //name,age,msg } alert(c.name); //andy
// 含this,返回值是一个对象 function fun() { this.sex = "man"; //组装一个对象 var obj = {}; obj.name = 'andy'; obj.age = 20; obj.msg = function(){} return obj; } var c = new fun(); for (var atr in c) { alert(atr); //name,age,msg } alert(c.name); //andy
两段的输出结果是一样的,c都含有name,age,msg属性而不含sex属性。说明当返回值是对象类型(对象,数组,函数)时,new不会用this去构造对象,而直接返回组装的对象。
这种方式实际上是工厂方式,在应用中更多的程序员把函数名首字母大写,让它看起来更像一个类。
/** * 定义一个函数Car */ function Car(color,doors) { var car = {}; car.color = color; car.doors = doors; car.msg = function(){ alert("This is a " + this.color + " car, there are " + this.doors + " doors." ); } return car; }
定义了函数Car,函数内创建了一个空对象,添加了一些属性和方法后返回。
以下是两种创建方式
// 方式1 var c1 = Car('red',2); c1.msg(); // 方式2 var c2 = new Car('black',4); c2.msg();
方式1是函数调用,方式2是new。方式2把Car当成了一个类,但实际上并不是(Car的this和prototype都未挂属性,方法)
相关文章推荐
- JavaScript中具名函数的多种调用方式总结
- JavaScript中具名函数的多种调用方式总结
- JavaScript中具名函数的多种调用方式(1)
- (2)Javascript之函数的多种调用方式
- JavaScript中七种函数调用方式及对应 this 的含义
- 网页制作之JavaScript部分3--事件及事件传输方式(函数调用 练习题 )重要---持续更新中
- javascript调用匿名函数的多种方式
- JavaScript中七种函数调用方式及对应 this 的含义
- JavaScript实现二级、多级(N级)联动下拉列表框更新版,支持IE6,FireFox,函数和类两种调用方式,支持到N级,非常通用。
- Javascript中匿名函数的多种调用方式总结
- 具名函数的四种调用方式(2)
- javascript 函数的三种调用方式 call / apply / bind
- JavaScript实现二级、多级(N级)联动下拉列表框更新版,支持IE6,FireFox,函数和类两种调用方式,支持到N级,非常通用
- JavaScript中七种函数调用方式及对应 this 的含义--解决函数依次调用问题
- javascript 具名函数的四种调用方式 推荐第1/3页
- Javascript中匿名函数的多种调用方式总结
- Javascript中匿名函数的多种调用方式
- javascript 函数的4种调用方式与 this(上下文)的指向
- 通过javascript 函数的调用方式来理解"this"
- javascript三种函数调用方式