我有这样的代码:
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(),而不知道哪个是主要功能,在这种情况下是用户。
在静态方法中使用这样的东西。
答案 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
的方法。因此this
与User
相同,而b
只能致电this.a()
,您应该好好去。