javascript匿名函数应用

时间:2023-02-07 19:14:13

1.给指定对象新增一些属性的写法:

1 /*给一个对象增加属性*/
2 var myDate=(function(obj){
3 obj.addName=function(name){
4 this.name=name;
5 }
6 return obj;
7 }(myDate||{}));
8 /*此用myDate||{}这种方式确保传进去的是一个对象*/

2.重载指定对象的某个方法:

 1     var myDate2={name:'zhangsan',
2 addAge:function(age){
3 this.age=age;
4 }
5 };
6
7 var myDate2=(function(obj){
8 var oldAddAge=obj.addAge;//保留以前的方法,以后可以调用
9 obj.addAge=function(age){
10 oldAddAge(age+1);//这样写能重载myDate2的addAge方法吗?当然不能,这个age被加到了window对象上了。
11 }
12 return obj
13 }(myDate2||{}));
14
15 myDate2.addAge(10);

上面的写法是不行的,这样不能实现重载对象的某个方法,原因是对象原来的addAge方法中this指向了window,无法绑定到myDate2上面。

 1     var myDate2={name:'zhangsan',
2 addAge:function(age){
3 this.age=age;
4 }
5 };
6
7 var myDate2=(function(obj){
8 //var oldAddAge=obj.addAge;
9 /*
10 //这个地方不能再保留以前的函数供以后使用了,原因是addAge函数中使用了this,如果再次引用
11 //this就指向了window对象。故重载函数中不能再调用原来的函数。
12 */
13 obj.addAge=function(age){
14 this.age=age+10;
15 }
16 return obj;
17 }(myDate2||{}));
18
19 myDate2.addAge(10);

换成这种方式,可以重载对象中的addAge方法。

 3.使用原型做一个简单加减运算:

 1     var calc=function(numx,operx){
2 this.numx=numx;
3 this.operx=operx;
4 }
5 calc.prototype={
6 add:function(a,b){
7 return a+b;
8 },
9 sub:function(a,b){
10 return a-b;
11 }
12 };
13
14 var c=(new calc).add(3,4);

 4.函数,对象,constructor,prototype之间的关系:

 1 var FOO=function(){
2 this.name='zhangsan';
3 }
4 FOO.prototype.getName=function(){
5 return this.name;
6 }
7
8 var p=new FOO();
9 var d={};
10 console.log(p.constructor=== FOO);// true,用函数构造的对象,其构造函数是该函数本身
11 console.log(d.constructor===Function);//flase
12 console.log(d.constructor===Object);//true,直接生成的对象,其构造函数是Object
13 console.log(FOO.constructor===Function);//true,函数本身的构造函数,是Function
14 console.log(p.constructor.constructor===Function);//true,这个是一个传递
15 console.log(FOO.prototype.constructor===FOO);//true,每个函数都有一个prototype,其prototype.constructor指向该函数本身

 当重写函数的prototype后,由函数够造的对象的构造函数会发生变化:

 1         var BOO=function(){
2 this.name='zhangsan';
3 }
4 BOO.prototype={age:function(age){
5 this.age=age;
6 }
7 };//注意与上面的那种写法不一样,这种是重写,上面那种只是修改
8 var b=new BOO();
9 console.log(b.constructor===BOO);//false,由于重写了函数BOO的prototype导致constructor变化
10 console.log(BOO.constructor===Function);//true
11 console.log(BOO.prototype.constructor===BOO);//false,重写了prototype导致constructor变化
 1         var BOO=function(){
2 this.name='zhangsan';
3 }
4 BOO.prototype={age:function(age){
5 this.age=age;
6 }
7 };
8 /*
9 BOO.prototype=new Object({age:function(age){this.age=age;}});
10 上面重写prototype相当于这种方法
11 */
12 var b=new BOO();
13 console.log(b.constructor===Object);//true
14 console.log(BOO.prototype.constructor===Object);//true

如何修改BOO的构造函数呢?

 1         var BOO=function(){
2 this.name='zhangsan';
3 }
4 BOO.prototype={age:function(age){
5 this.age=age;
6 }
7 };
8 BOO.prototype.constructor=BOO;//重写BOO函数的prototype.constructor以后可以修复这个问题
9 var b=new BOO();
10 console.log(b.constructor===BOO);//true
11 console.log(BOO.prototype.constructor===BOO);//true