0

我有两个用作类的函数:PersonEye. Person自己创建一个Eye对象。稍后,我尝试访问创建的眼睛对象,每当用户单击网页时,都会使用事件处理程序。

function Eye(){
   this.color="Green";
}


function Person() {

   this.name="John";
   this.eye = new Eye();
   //eye=this.eye; // uncomment and everything works!

   document.addEventListener("click", function(){
      console.log(name); // This works

      console.log(eye);  // This doesn't work

   })

}

var person= new Person();

为什么这不起作用?制作第二个变量eye似乎可以解决问题,但我不知道为什么..

4

2 回答 2

1

它不起作用,因为“眼睛”不是变量,它是对象的属性。您没有做任何事情来告诉 JavaScript 要查看什么对象。

您必须将 的值保存this在另一个局部变量中:

function Person() {
  this.name="John";
  this.eye = new Eye();
  var person = this;

然后你可以在事件处理程序中使用它:

    console.log(person.eye);
于 2013-04-06T16:36:11.557 回答
0
document.addEventListener("click", function() {
    console.log(name);
    console.log(eye);
});

在这种情况下,namename的是窗口对象的属性,因为您没有指定要访问它的对象。window.name恰好返回"result"我的实施。并且 oggingeye将不起作用,因为eye尚未将其定义为变量。

要解决此问题,请使用一个变量来存储对事件函数外部当前对象的引用并在内部使用它。

var ref = this;

document.addEventListener("click", function() {
    console.log(ref.name);
    console.log(ref.eye);
});

输出:

John
Eye { color: "Green" }

现场演示

于 2013-04-06T16:37:05.350 回答