javascript 高手,请教个关于 this 与self的区别的问题 50
var name='countDownTimer'
}
countDownTimer.prototype={
init:function(){
alert(this.name)
},
}
t1=countDownTimer();
t1.init()
结果会输出什么?
t1=countDownTimer();
这个是我一时手快写少了个new 展开
1). t1.init(); 会报错,TypeError: Cannot read property 'init' of undefined,原因是你将countDownTimer();当做了一个函数来执行,事实上你是想将他看做一个“类”,然后实例化它赋值给t1,应该用
t1 = new countDownTimer();
2). 改成 t1 = new countDownTimer();之后,浏览器会alert "undefined",原因是name只是countDownTimer这个函数的局部变量,需要改成
this.name = 'countDownTimer';
3). 标题中的问题,js中确实有self这个全局变量,指代window自己,但是就我看到的很少有这么用的。
大多都是在函数第一句用 var self = this; 来保存原始的this变量,看下面这个例子,来自stackoverflow:
function Note() {
var self = this;
var el = document.createElement('div');
// ...
el.addEventListener('mousedown', function(e) { return self.onMouseDown(e) }, false);
// ...
}
由于js中,this会变成当前的context,所以如果将
el.addEventListener('mousedown', function(e) { return self.onMouseDown(e) }, false);
变成
el.addEventListener('mousedown', function(e) { return this.onMouseDown(e) }, false);
this就变成了el, 而不是Note的实例化变量了,因此要用var self = this;保留原始的对Note的指向,不知道说明了没有,可以再讨论吧。
这个stackoverflow问题的连接是,http://stackoverflow.com/questions/962033/what-underlies-this-javascript-idiom-var-self-this,可以看看
有两个错误吧:
// 错误1
function countDownTimer(){
this.name='countDownTimer'; // 用var定义了局部变量,并不是类的属性
}
// 错误2
t1 = new countDownTimer(); // 初始化类的方式,而不是t1=countDownTimer();
这样改正后,结果才是alert出countDownTimer
那你直接用this.name 如果同一窗口 要生成多个对象呢?比如
t1=new countDownTimer()
t2=new countDownTimer();
这样这些属性不被t2覆盖了吗?因为this指同window 那么,同一window下你只能生成一个这样的对象。那有什么意思?面向对象本来就是为了重用
function countDownTimer(var_name){
this.origin = "name";
this.name = var_name;
}
t1 = new countDownTimer("name1");
t2 = new countDownTimer("name2");
既然你要属性可变,可以变量代入;或者可以用prototype写一个更改属性的方法;对于始终不变的固有属性,可以直接给定,例如上面的origin属性
这样修改一下
t1=new countDownTimer(); //你本想利用原型的方法,就需要这样
会输出 undefined.原因是 name是私有的。
你可以这样修改一下:
function countDownTimer(){
this.name='countDownTimer'
}
这样的结果就是countDownTimer
我要的并不是显示countDownTimer,我是想问 你在function countDownTimer下直接用this,那么this指向那了?这样会指向window的。这意味着你的方法 不能被重用,也就是同一个窗口中
t1=new countDownTimer();
t2=new countDownTimer();
这样t1的所有属性就会被t2覆盖
原来你比我还菜,我都不会猜init未定义
你要这么说肯定alert一个未定义了,如果你改成 this.name='countDownTimer',那么就会alert这个countDownTimer了