5

我有这样的代码:

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(),在这种情况下是 User。

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

4

4 回答 4

10

实际上,js 中没有方法或静态方法,只有分配给对象属性的函数(函数也是对象),它们都以相同的方式工作。既然你这样称呼它User.b()this就会User接听电话。

User.b = function() {
    return this.a();
}
于 2012-06-28T16:33:56.947 回答
7

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

如果您使用普通标识符(函数名、变量或属性)调用它,则上下文将是全局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();
}
于 2012-06-28T17:02:19.037 回答
0

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

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

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

var client= new User()

然后您将可以使用客户端访问用户的所有方法

client.b() //returns 'try'
于 2012-06-28T16:37:21.093 回答
0

好吧,函数独立于它们的容器对象而存在;他们只是价值观。因此,如果您不将它们作为对象上的方法调用,它们会继承this调用上下文中的任何内容。在这种情况下,期望他们知道他们的容器与分配User.x值 1 然后期望数字 1 以某种方式知道关于User.

但是,当您调用User.a()or时User.b(),实际上在将它们作为方法调用 - (function object) 的方法User。所以this将与 , 一样Userb可以打电话this.a(),你应该很高兴。

于 2012-06-28T16:44:58.920 回答