javascript,在名称也是attrName的函数中使用this.attrName

时间:2014-04-26 06:07:35

标签: javascript this

我发现了一些奇怪的事情......

function Man(){
    this.Man = "Peter";
}
我打电话之后

。 (不要将它用作构造函数)

Man()

我认为结果将是

alert(Man.Man)//-->Peter

但是......我错了,其实结果是:

alert(Man.Man)//-->undefined
alert(Man)//-->Peter

那真是令人困惑,怎么回事?

2 个答案:

答案 0 :(得分:2)

我会向你解释那里发生的事情。

1

function Man(){
    this.Man = "Peter";
}

this函数中的Man()window

2

Man();

您正在调用该函数。这将全局变量Man的值设置为"Peter"

请注意,this.Man = "Peter"等于window.Man = "Peter",因为this指的是window

3

alert(Man.Man)

第2步中的函数调用Man();使函数Man变为字符串变量。现在Man是一个变量,其值是一个字符串,并且它不包含属性Man,因此它是undefined

4

alert(Man)

现在,您实际上正在警告在Man()调用中创建的全局变量,并将其设置为"Peter"

的值

答案 1 :(得分:1)

我使用了Chrome控制台并获得了其他一些发现

function Man(){
    this.Man = "Peter";
    console.log("this", this);
}

以上是指Window。如果调用函数Man()则不会返回任何内容,因为函数不返回任何内容,只是将窗口对象上的属性Man设置为Peter。您的第Man.Man行应在Chrome中返回undefined。如果您使用Man().Man,那么您将得到未定义,因为this引用了窗口对象,而函数Man()没有属性Man。你可以写

function Man(){
    this.Man = "Peter";
    return this.Man;
}

返回值Peter。如果您想要一个属性Man,可以使用constructor function写入

// set this.Man == window.Man to Peter    
function Man() { this.Man = "Peter"; } 

// create an constructor for each object Man
Man.prototype = { constructor: this.Man } 

// create an object 
var man = new Man(); 

// call his property which was set in the constructor of the prototype
man.Man; 

如果不清楚,请寻求更多帮助。

更新为对评论的回复

您可以在不使用原型的情况下使用构造函数(如果您使用此语法,请参阅examples at mdnthis question

function Box(color) // Constructor
{
    this.color = color;
}

var redBox = new Box("red");
var blueBox = new Box("blue");

redBox.color; // returns red
blueBox.color; // returns blue

要了解this所指的位置,您可以查看understanding javascript this。在框中,示例this引用"基础类函数"的新实例(对象)。在function Man(){this.Man = "Peter"}中,this指的是this.window。您可以阅读更多about protype in this book