静态方法中的Javascript“this”

时间:2012-06-28 16:30:40

标签: javascript oop class static-methods

我有这样的代码:

User = function(){}

User.a = function(){
  return "try";    
}

User.b = function(){

}

从User.b()我可以使用:

调用User.a()
User.b = function(){
    return User.a();
    }

但不使用它,因为它不是用户的实例(User.a()和User.b()类似于“静态方法”。

我想要做的是能够从User.b()调用User.a(),而不知道哪个是主要功能,在这种情况下是用户。

在静态方法中使用这样的东西。

4 个答案:

答案 0 :(得分:5)

实际上js中没有方法或静态方法,只有分配给对象属性的函数(函数也是对象),它们都以相同的方式工作。由于您将其称为User.b()this将为User进行通话。

User.b = function() {
    return this.a();
}

答案 1 :(得分:3)

决定函数上下文的唯一方法就是你如何调用它。

如果使用普通标识符(函数名,变量或属性)调用它,则上下文将是全局window对象:

someFunction();

如果使用句点来调用它来访问对象成员,则上下文将是对象:

someObject.someFunction();

如果将成员从对象复制到变量,则不再与该对象建立连接,并且将使用window作为上下文调用它:

var x = someObject.someFunction;
x();

如果将一个函数作为属性分配给对象,并使用该对象调用它,则上下文将是对象:

someObject.x = someFunction;
someObject.x();

对于您的具体情况,User是一个函数,也是一个对象。

如果使用User.b调用该函数,其上下文将是User对象,在这种情况下恰好是一个函数。在函数中,您仍然可以使用this来访问上下文:

User.b = function(){
  return this.a();
}

答案 2 :(得分:0)

您在javascript中没有正常继承。我想你正试图做这样的事情:

User = function(){
    this.a= function(){
         return 'try';
    }
    this.b= function(){
        return this.a();
    }
}

这样用户就成了一个构造函数。每个新的User实例都可以访问这些方法。因此,如果要创建User类的新实例,可以使用new关键字:

var client= new User()

然后您将可以使用客户端

访问用户的所有方法
client.b() //returns 'try'

答案 3 :(得分:0)

嗯,函数独立于容器对象存在;他们只是价值观。所以如果你没有将它们作为对象的方法调用,它们会继承调用上下文中的this。在这种情况下,期望他们知道他们的容器与分配User.x值1然后期望数字1以某种方式了解User相同。

但是,当您致电User.a()User.b()时, 实际上是将它们称为方法 - (函数对象)User的方法。因此thisUser相同,而b只能致电this.a(),您应该好好去。