我发现了一些奇怪的事情......
function Man(){
this.Man = "Peter";
}
我打电话之后。 (不要将它用作构造函数)
Man()
我认为结果将是
alert(Man.Man)//-->Peter
但是......我错了,其实结果是:
alert(Man.Man)//-->undefined
alert(Man)//-->Peter
那真是令人困惑,怎么回事?
答案 0 :(得分:2)
我会向你解释那里发生的事情。
function Man(){
this.Man = "Peter";
}
this
函数中的Man()
为window
。
Man();
您正在调用该函数。这将全局变量Man
的值设置为"Peter"
。
请注意,this.Man = "Peter"
等于window.Man = "Peter"
,因为this
指的是window
。
alert(Man.Man)
第2步中的函数调用Man();
使函数Man
变为字符串变量。现在Man
是一个变量,其值是一个字符串,并且它不包含属性Man
,因此它是undefined
。
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 mdn或this 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。