Javascript 如何处理fn.调用(此)替换原来的此

Javascript 如何处理fn.调用(此)替换原来的此,javascript,Javascript,首先,我有一个用于管理员工的应用程序。当用户创建应用程序的新实例时,我希望他们可以选择提交一个函数,该函数将在应用程序中的任何其他操作之前运行。问题是,我需要将功能添加到该函数的末尾,以便将其传递回应用程序 但是,如果我在StateManager.js类中使用fn.call(this),它就会覆盖StateManager的this,并去掉StateManager的功能。返回的确切错误是uncaughttypeerror:this.onPreload不是函数 基本上,当创建一个新实例时,我希望使用

首先,我有一个用于管理员工的应用程序。当用户创建应用程序的新实例时,我希望他们可以选择提交一个函数,该函数将在应用程序中的任何其他操作之前运行。问题是,我需要将功能添加到该函数的末尾,以便将其传递回应用程序

但是,如果我在
StateManager.js
类中使用
fn.call(this)
,它就会覆盖StateManager的
this
,并去掉
StateManager
的功能。返回的确切错误是
uncaughttypeerror:this.onPreload不是函数

基本上,当创建一个新实例时,我希望使用用户的
preload
函数并将其传递给
StateManager.js
,在那里对其进行调整

下面是演示代码:

类应用程序{
构造函数(选项={}){
返回新用户(选项);
}
}
类用户{
构造函数(选项){
这是._options=options;
this.state=新的StateManager(this);
this.job=新作业(this);
this.init();
}
init(){
this.state.onPreload=this.\u options.preload;
this.state.preload.call(this);
}
}
班级作业{
构造函数(用户){
this.user=用户;
}
更改标题(标题){
this.user.jobTitle=标题;
}
}
类状态管理器{
构造函数(用户){
this.user=用户;
this.onPreload=null;
}
预载{
这是一个.onPreload();
}
}
常量选项={
预载:预载
};
const app=新应用程序(选项);
函数预加载(){
app.job.changeTitle(“CEO”);
}
preload()
指的是全局变量
app
,但它首先在用于初始化
app
的函数中被调用。它需要接收正在初始化的
用户
对象,而不是引用全局变量

使用
this.state.onPreload=this.\u options.preload.bind(this)
预加载
函数的上下文绑定到该对象

您还可以将
StateManager.preload()
更改为使用
this.onPreload.call(this.user)。但这可能会产生一种不适当的依赖关系,这种依赖关系并不适用于所有情况。如果我能更好地理解所有的关系,我也许能更好地做出决定

类应用程序{
构造函数(选项={}){
返回新用户(选项);
}
}
类用户{
构造函数(选项){
这是._options=options;
this.state=新的StateManager(this);
this.job=新作业(this);
this.init();
}
init(){
this.state.onPreload=this.\u options.preload.bind(this);
this.state.preload();
}
}
班级作业{
构造函数(用户){
this.user=用户;
}
更改标题(标题){
this.user.jobTitle=标题;
}
}
类状态管理器{
构造函数(用户){
this.user=用户;
this.onPreload=null;
}
预载{
这是一个.onPreload();
}
}
常量选项={
预载:预载
};
const app=新应用程序(选项);
console.log(app.jobTitle);
函数预加载(){
本.职务.变更职务(“CEO”);

}
我看不出您在哪里使用类似于
fn.call(this)的东西
StateManager.js
中-也许你应该显示你遇到问题的代码-因为你没有名为
fn的函数
很难猜到你在说什么
它将在哪里调整
-这到底是什么意思?你为什么要这么做?为什么要使用
this.state.preload.call(this)而不仅仅是
this.state.preload(this)
预加载函数接受一个参数
预加载(app){/*使用app.whichere*/}
?问题是您在分配
app
之前试图使用它
newapplication()
最终调用
preload()
preload()
尝试使用
app
,但这一切都发生在用于初始化
app
的表达式中。它只是
const-app=someFunc()的复杂版本;函数someFunc(){return app+1;}
工作起来很有魅力,但我只有一个问题,有没有办法使用
app.job.changetTitle
而不是
this.job.changetTitle
?使用
可能会让一些用户感到困惑,因为此应用程序最终将达到超高级别,因此即使是非程序员也可以相当轻松地使用它。不,无法在代码中使用首先初始化变量的变量。也许您可以将其分为两个步骤:首先初始化变量,然后对其调用调用
preload()
的方法。