2010-08-03 138 views
3

JavaScript的新手在这里。我有以下代码:JavaScript OOPS问题

function testObject(elem) { 
    this.test = "hi"; 
    this.val = elem; 
    console.log(this.test+this.val); 
    echo(); 

    function echo() { 
     console.log(this.test+this.val); 
    } 
} 

var obj = new testObject("hello"); 

当它运行时,我希望在控制台输出两次“hihello”。相反,它首次按预期输出,但第二次返回NaN。

我确定我在这里错过了一些东西。我认为内部功能可以访问外面的变量。有人能指导我吗?我更像是一个功能强大的UI开发人员,并且没有太多面向对象代码的经验。

谢谢!

回答

3

的问题是,内部echothis值指向全局对象,和this.testthis.val(其指的是window.testwindow.val)是undefined

您可以通过调用它像设置回声的this值:

echo.call(this); 

这是因为你被echo();调用的函数,那么this值被隐式设置为全局对象。

查看this question了解this价值如何工作。

编辑:为了能够调用刚刚echo();你应该坚持从外部功能方面的this值,有很多方法可以做到这一点,例如:

//... 
var instance = this; // save the outer `this` value 
function echo(){ 
    console.log(instance.test+instance.val); // use it 
} 
echo(); 
//... 

或者

+0

我觉得我得到的想法。如果回声函数也带参数呢? echo(“sometext”)。call(this)似乎不起作用。 – 2010-08-03 20:17:59

+0

@Newbie:你可以简单地在'call'的第一个参数之后传递它们,例如'echo.call(this,'arg1','arg2');' – CMS 2010-08-03 20:18:55

+0

谢谢,这有效,但这也意味着我将不得不改变我的每个函数调用。任何方式我可以修改函数声明本身,使其工作?再次感谢! – 2010-08-03 20:25:05

2

你也这样做:

function testObject(elem) { 
    this.test = "hi"; 
    this.val = elem; 
    console.log(this.test+this.val); 

    this.echo = function() { 
     console.log(this.test+this.val); 
    } 
    this.echo(); 
} 

var obj = new testObject("hello"); 

每当您拨打this.echo()obj.echo(),this将被绑定到调用该函数的对象。

1

就个人而言,我觉得它优雅的声明这样的类方法:

function testObject(elem) { 
    this.test = "hi"; 
    this.val = elem; 
    this.echo(); 
} 

testObject.prototype = { 
    echo: function() { 
     console.log(this.test + this.val); 
    } 
} 

var obj = new testObject("hello");