javascript中function(){}(),new function(),new Function(),Function
通过function构造类时this的指向
如果function被构造为一个类,那么必然存在该类被实例化的一个过程,如果没有实例化,那么该类实际上并没有在程序中被使用。而一旦实例化,那么this将指向实例化的对象。
var age = 3;
var cat1 = new function() {
this.name = 'Tom';
this.age = 2;
this.weight = function(age) {
var age = age * 2;
var _age = this.age * 2;
return 'weight by age:' + age + '; weight by this.age:' + _age;
}(this.age);
this.eye = new function() {
this.size = '1.5cm';
this.color = 'red';
};
this.catching = function(mouse) {
return this.name + ' is catching ' + mouse;
};
};
alert(cat1.weight);
alert(cat1.eye.color);
alert(cat1.catching('Jerry'));
根据我们的原则,this指向实例化对象,我们来对每一个this进行分解。
首先是cat1.weight,我使用了function(){}(),直接利用猫咪的年龄进行计算得出体重返回给weight属性。
第一个this.age出现在function(){}(this.age),这个this.age实际上是一个传值过程,如果你对我之前分析function(){}()比较了解的话,应该知道,this.age实际上是和前面this.age = 2指同一个,这里的this.age的this,首先要去找它所在的function,然后看这个function是否被实例化,最后确认,确实被实例化为cat1,因此this=cat1。
第二个this.age出现在function(){this.age}()。同样,你先需要对function(){}()再次深入了解,实际上,function(){}()就是执行一个函数而已,我们前面提到了,普通函数执行中this=window,所以,这里的this.age实际上是var age = 3。
第三个this.color出现在new function(){this.color},这里就比较好玩,由于有一个new,实际上也被实例化了,只不过是对匿名类的实例化,没有类名,而且实例化仅可能出现这一次。因此,this.color的this要去找new function的主人,也就是this.eye,而this.eye的this=cat1,所以cat1.eye.color='red'。
第四个this.name出现在function(){this.name},它出现在cacthing方法中,它既不是普通的函数执行,也不是实例化为对象,而是正常的类中的方法的声明,因此this指向要去找它所在的function被实例化的对象,也就是cat1。