将构造函数改为如下所示:
function tDialog()
{
this.rMask = 1;
this.rightWidth = 0;
this.rightHeight = 0; rightMaskDiv = top.right.document.createElement("div");
rightMaskDiv.setAttribute('id','rightMask');
rightMaskDiv.style.height = this.rightHeight + "px";
rightMaskDiv.style.width = this.rightWidth + "px";
rightMaskDiv.style.zIndex = "5000";
rightMaskDiv.style.filter ="progid:DXImageTransform.Microsoft.Alpha(opacity=40)";
rightMaskDiv.style.background = "#666666";
rightMaskDiv.style.top = 0;
rightMaskDiv.style.position = "absolute";
this.maskDiv = rightMaskDiv; //此处如此赋值,在其他方法中引用this.maskDiv会存在什么问题? //初始化部分,以下省略...
}
function tDialog()
{
this.rMask = 1;
this.rightWidth = 0;
this.rightHeight = 0; rightMaskDiv = top.right.document.createElement("div");
rightMaskDiv.setAttribute('id','rightMask');
rightMaskDiv.style.height = this.rightHeight + "px";
rightMaskDiv.style.width = this.rightWidth + "px";
rightMaskDiv.style.zIndex = "5000";
rightMaskDiv.style.filter ="progid:DXImageTransform.Microsoft.Alpha(opacity=40)";
rightMaskDiv.style.background = "#666666";
rightMaskDiv.style.top = 0;
rightMaskDiv.style.position = "absolute";
this.maskDiv = rightMaskDiv; //此处如此赋值,在其他方法中引用this.maskDiv会存在什么问题? //初始化部分,以下省略...
}
{
//此时的this==okBtn,而不是 tDialog的实例对象了
alert(this.rMask); //此处在运行中显示undefined,先前不是初始化时就赋值为1吗?
if(this.rMask)
{
/* 移除先前动态创建的div */
}
}
我在 okBtn.onclick = this.enabled 这句之前加一句 alert(this.rMask);
显示的是我在之前赋的1。这是什么原因?是不是说明这里的this==tDialog??
总觉得在进入tEnabled()后this就变了。
{
var okBtn = document.createElement("input");
okBtn.setAttribute('id','okBtn');
okBtn.type= "button";
okBtn.value = "确 定";
var Wrapper=this;//==========================建立闭包对象,此时Wrapper为tDialog的实例对象
//点击关闭
okBtn.onclick =function(){ Wrapper.enabled();}; //=========使用闭包对象,而不是this,this==okBtn //响应回车
okBtn.onkeydown = function ()
{
if(event.keyCode == "13")
{
Wrapper.enabled();//========使用闭包对象,而不是this,this==okBtn
}
}
document.getElementById('btnDiv').appendChild(okBtn);
}
我在 okBtn.onclick = this.enabled 这句之前加一句 alert(this.rMask); ,显示的是我在之前赋的1。这是什么原因?
---------
此时this为tDialog的实例,当然能输出1
但是okBtn.onclick = this.enabled; 这样来添加事件处理时,this.enabled==>tEnabled,但是tEnabled中的this==okBtn了,okBtn无rMask属性,当然为undefined面向对象虽然好用,但要理解作用区域,这个是关键
要赶快弄明白此处要用闭包对象的原因。