问题一:面向对象-new时的初始值
<pre>
function C1(name){
if(name)this.name = name;
}
function C2(name){
this.name = name;
}
function C3(name){
this.name = name||'john';
}
C1.prototype.name = 'tom';
C2.prototype.name = 'tom';
C3.prototype.name = 'tom';
//3个使用new操作符时,都没有传入初始变量
alert ((new C1()).name + (new C2()).name + (new C3()).name);
</pre>
这道题得到的结果:tomundefinedjohn;
分析:
C1,if不成立,new C1()中没有name属性,就访问到了原型上的name,输出tom
C2,既然没有参数,也就是执行new C2(undefined),所以name为undefined
C3,new C3()的name值为john,所输出john
延伸:
当代码读取某个对象的某个属性时,都会执行一次搜索,目标是具有给定名字的属性。
首先从对象本身搜索,如果找到了,返回该属性的值;如果没有找到会继续搜索指针指向的原型。
问题二:this的指向
window.val = 1;
var json = {
val:10,
dbl: function () {
this.val*=2;
}
};
//db1作为方法调用,此时this为json json.val=20 (10*2)
json.dbl();
//db1函数赋值给db1变量后,此时的db1是一个普通的函数
var dbl = json.dbl;
//普通函数调用,this指向window ,window.val为 2 (1*2)
dbl();
//Function的call方法调用,指定this为window,使用apply也类似 window.val为 4 (2*2)
json.dbl.call(window);
//所以结果为 24
alert(window.val+json.val);
问题三:闭包
var test = (function (i) {
return function(){
alert(i*2);
};
}(2));
//test通过一个立即执行函数返回了一个匿名闭包函数,这个匿名闭包函数绑定了执行是传入的参数2
//且匿名闭包函数没有对传入自身的参数有特殊处理(利用arguments属性)
//所以test(5)和test()等价
test(5);