javascript 高手,请教个关于 this 与self的区别的问题 50

functioncountDownTimer(){varname='countDownTimer'}countDownTimer.prototype={init:func... function countDownTimer(){
var name='countDownTimer'
}
countDownTimer.prototype={
init:function(){
alert(this.name)
},

}

t1=countDownTimer();
t1.init()
结果会输出什么?
t1=countDownTimer();
这个是我一时手快写少了个new
展开
 我来答
土杜土杜
2014-08-29 · TA获得超过253个赞
知道小有建树答主
回答量:155
采纳率:71%
帮助的人:99万
展开全部

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,可以看看

learneroner
高粉答主

2014-08-29 · 关注我不会让你失望
知道大有可为答主
回答量:1.1万
采纳率:91%
帮助的人:6521万
展开全部

有两个错误吧:

// 错误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属性

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
如是我之闻
2014-08-29 · TA获得超过1237个赞
知道小有建树答主
回答量:1207
采纳率:57%
帮助的人:819万
展开全部

这样修改一下 

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覆盖
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
水瓶注册个毛啊
2014-08-29 · 超过11用户采纳过TA的回答
知道答主
回答量:73
采纳率:0%
帮助的人:19.7万
展开全部
肯定报init未定义的错
更多追问追答
追问
原来你比我还菜,我都不会猜init未定义
追答
你要这么说肯定alert一个未定义了,如果你改成 this.name='countDownTimer',那么就会alert这个countDownTimer了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式