Javascript";这";静态法

Javascript";这";静态法,javascript,oop,class,static-methods,Javascript,Oop,Class,Static Methods,我有这样一个代码: User = function(){} User.a = function(){ return "try"; } User.b = function(){ } ​ 从User.b()中,我可以使用以下方法调用User.a(): 但不要使用它,因为它不是user的实例(user.a()和user.b()类似于“静态方法”) 我想做的是能够从User.b()调用User.a(),而不知道哪个是主函数,在本例中是User 在静态方法中使用类似的方法。实际上,js

我有这样一个代码:

User = function(){}

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

User.b = function(){

}
​ 从User.b()中,我可以使用以下方法调用User.a():

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

我想做的是能够从User.b()调用User.a(),而不知道哪个是主函数,在本例中是User


在静态方法中使用类似的方法。

实际上,js中没有方法或静态方法,只有分配给对象属性的函数(函数也是对象),它们都以相同的方式工作。由于您像
User.b()
那样调用它,
将是调用的
User

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

javascript中没有正常的继承。我猜你是想做这样的事情:

User = function(){
    this.a= function(){
         return 'try';
    }
    this.b= function(){
        return this.a();
    }
}
这样,用户就变成了构造函数。每个新的用户实例都将拥有这些方法的访问权限。因此,如果要创建User类的新实例,可以使用new关键字:

var client= new User()
然后,您将可以从用户使用客户端访问所有方法

client.b() //returns 'try'

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


然而,当您调用
User.a()
User.b()
时,实际上是将它们作为(函数对象)
User
的方法调用。因此,
将与
用户
相同,
b
可以调用
this.a()
,您应该准备好了。

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

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

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

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

如果将成员从对象复制到变量,则不再有与该对象的连接,将使用
窗口
作为上下文调用该对象:

var x = someObject.someFunction;
x();
如果将函数指定为对象的属性,并使用对象调用它,则上下文将是对象:

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

对于您的特定情况,
User
是一个函数,也是一个对象

如果使用
User.b
调用函数,其上下文将是
User
对象,在本例中,该对象恰好是函数。在函数中,您仍然可以使用
访问上下文:

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

a()
。。。这将为您提供
ReferenceError
。你是说
this.a()
我觉得值得一提的是,这个时期不是重要的部分,因为
foo.bar
只是
foo['bar]
的糖。当您从容器中检索函数对象并调用它时,
this
被设置为容器:
SomeObject.someFunction()
-
this
被设置为
SomeObject
SomeObject['someFunction']()
-相同<代码>(SomeObject.someFunction)(
-相同(!)
(f=SomeObject.someFunction)(
-
设置为全局对象。当您说Javascript没有方法时,您对“方法”和“函数”的定义是什么?你会得到一个神奇的额外参数,它的值取决于你调用函数所使用的对象,这看起来非常像方法。如果你对“方法”的定义要求类的存在,那么我认为你的定义可能过于狭窄。如果还有别的事,我很好奇那是什么。谢谢。@MarkReed函数与任何东西都没有关联,您可以像
var a=User.b
那样存储函数
User.b
,当您调用
a()
时,它会改变一切。一种常见的方法是添加事件监听器,如
elem.addEventListener(“click”,this.clicked,false)
,这可以通过使用来解决,尽管很多人只是在这一点上删除oop并使用内联闭包。我的观点是,
this.clicked
this
没有任何关联,它只是一个愚蠢的函数引用。我不同意。JavaScript中的方法不是像函数那样的一级对象,但这并不等于说它们不存在。否则,C++、java、python和许多其他面向对象语言也没有方法。@ MarkReed,你是指方法和JavaScript中的函数有些不同,它们不是一流的对象吗?这是什么意思?方法和函数之间没有区别,当调用函数作为某个对象的属性时,可以将其称为方法,但它仍然是函数和一级对象。如果要继续,我们应该将其带到聊天室。但是很快:根据您的
addEventListener
示例,您认为JS没有方法的理由是函数值没有封装它们的invocants。我认为这表明,虽然JS有一流的函数(可以传递函数值),但它没有一流的方法(这些值不包括invocant)。所以我相信方法在JS中不是一流的。但我不认为它们不存在,因为没有它们,
this
的神奇设置就没有意义。