为什么访问函数对象的属性给出了undefined?

时间:2015-12-27 20:51:29

标签: javascript object

使用Foo运算符访问属性x时,函数对象this会提供undefined。为什么?

function Foo(){ 
        this.x = "bar";
        return this;
    }

console.log(Foo.x); //undefined

我相信声明一个函数JS会自动创建一个可以添加属性的函数对象。例如,这有效:

Foo.today = "Sunday";
console.log(Foo.today); // Sunday

4 个答案:

答案 0 :(得分:1)

功能是对象。您在调用函数this时向Foo()引用的内容添加“x”属性,但代码中没有任何内容调用它。

如果您要调用这样的函数:

Foo.call(Foo);

在检查Foo.x的值之前,它会起作用。但是,通常,函数调用中this的值是对函数本身的引用。

你也可以这样做:

Foo.x = "bar";

通常,在函数中为this分配属性,特别是用作构造函数的属性,用于管理对象的属性(不是的对象)功能本身)。所以:

var f = new Foo();

将为您提供一个名为“x”且值为“bar”的属性的对象。

答案 1 :(得分:0)

只需删除return this;并使用var f = new Foo()即可。然后console.log(f.x)就可以了。

答案 2 :(得分:0)

谈论非严格的"模式,在您使用它的上下文中,this关键字默认为全局对象,因为它尚未通过调用函数本身来设置。因此,您只需在x对象上设置window属性。

答案 3 :(得分:0)

调用Foo.x将返回'undefined',因为x是实例(对象)属性而不是函数属性(Foo.x = "bar")。将x声明为类(函数)属性Foo.x = "bar";,而不是在console.log(Foo.x)中调用它。

在这种情况下,x是一个实例属性(this.x ='bar'),而不是一个类(function)属性(Foo.x='bar')来访问Foo.xFoo必须实例化为“var foo = new Foo()”,而不是调用foo.x返回Foo's x实例属性。