如何在javascript中从字典调用函数

如何在javascript中从字典调用函数,javascript,node.js,Javascript,Node.js,我只是在构建一个API_路由系统,让我可以为API构建以类为中心的模块,我不一定是为了行业最佳实践,我只是为了好奇而充实了如何用javascript构建东西的想法 我有一个ServerManager类,当服务器运行时处理所有处理,这个类使用我开发的API_Router类来处理提供的URL,并将请求传递给适当的模块进行处理 目前我使用的URL是 /用户/ 这告诉我的程序我打算访问用户模块 var http = require('http'); //#File: UserManager.js

我只是在构建一个API_路由系统,让我可以为API构建以类为中心的模块,我不一定是为了行业最佳实践,我只是为了好奇而充实了如何用javascript构建东西的想法

我有一个ServerManager类,当服务器运行时处理所有处理,这个类使用我开发的API_Router类来处理提供的URL,并将请求传递给适当的模块进行处理

目前我使用的URL是

/用户/ 这告诉我的程序我打算访问用户模块

var http = require('http');


//#File: UserManager.js
///http://localhost:8080/user/23123/
///http://localhost:8080/user/add/23123/
var UserManager = {};


UserManager.Create = function() {  
    var UserAcc = {
        "Username": "test123",
        "FirstName": "cody",
        "LastName": "jones",
        "Id": "000001"
    };

    return UserAcc;
}

UserManager.route = function(){
    return 'user';
}

UserManager.routeMapping = {
    "add": this.Create
}

UserManager.Run = function(Data){
    var runMe = Data[0];
    console.log(this.routeMapping);
    console.log(this.routeMapping[runMe]);

}


UserManager.hasSubmodule = false;


module.exports = UserManager;
每个模块都能够定义routeMapping函数中的子模块或函数

我正在附加处理用户模块的User.js文件

var http = require('http');


//#File: UserManager.js
///http://localhost:8080/user/23123/
///http://localhost:8080/user/add/23123/
var UserManager = {};


UserManager.Create = function() {  
    var UserAcc = {
        "Username": "test123",
        "FirstName": "cody",
        "LastName": "jones",
        "Id": "000001"
    };

    return UserAcc;
}

UserManager.route = function(){
    return 'user';
}

UserManager.routeMapping = {
    "add": this.Create
}

UserManager.Run = function(Data){
    var runMe = Data[0];
    console.log(this.routeMapping);
    console.log(this.routeMapping[runMe]);

}


UserManager.hasSubmodule = false;


module.exports = UserManager;
我正在尝试构建routeMapping函数,以关联我为API构建的所有函数,因此我需要确保根据URL调用适当的函数

UserManager.routeMapping = {
        "add": this.Create    //What am I doing wrong here
    }

UserManager.Run = function(Data){
    var runMe = Data[0];//This will resolve to a string "add"
    this.routeMapping[runMe]();//This should run the function stored in the routemapping

}

您使用此是错误的。该上下文中的
this
属于全局范围,因为您的新属性正好位于对象内部,并且该对象是在全局范围中定义的

您可以执行以下操作,它应该可以工作:

// This is not a function but an object, it doesn't get it's own `this`
UserManager.routeMapping = {
    "add": UserManager.Create  
}

// This is a function, and thus the `this` will be `UserManager`
UserManager.Run = function(Data){
    var runMe = Data[0];
    this.routeMapping[runMe]();
}
由于作用域中有
UserManager
,只需引用它的Create属性,它也是一个函数

这就是我认为你想要做的:

var UserManager = {};
UserManager.Create = function() {  
    var UserAcc = {
        "Username": "test123",
        "FirstName": "cody",
        "LastName": "jones",
        "Id": "000001"
    };

    return UserAcc;
}

UserManager.route = function(){
    return 'user';
}

UserManager.routeMapping = function () {
        return {
        "add": this.Create
      }
}

UserManager.Run = function(Data){
    var runMe = Data[0];
    var mappings = this.routeMapping();
    return mappings[runMe]();
}

console.log(UserManager.Run(["add"]))

请注意routingMapping是如何返回所需数据的函数。这一更改允许您使用

您对
的使用是错误的。该上下文中的
this
属于全局范围,因为您的新属性正好位于对象内部,并且该对象是在全局范围中定义的

您可以执行以下操作,它应该可以工作:

// This is not a function but an object, it doesn't get it's own `this`
UserManager.routeMapping = {
    "add": UserManager.Create  
}

// This is a function, and thus the `this` will be `UserManager`
UserManager.Run = function(Data){
    var runMe = Data[0];
    this.routeMapping[runMe]();
}
由于作用域中有
UserManager
,只需引用它的Create属性,它也是一个函数

这就是我认为你想要做的:

var UserManager = {};
UserManager.Create = function() {  
    var UserAcc = {
        "Username": "test123",
        "FirstName": "cody",
        "LastName": "jones",
        "Id": "000001"
    };

    return UserAcc;
}

UserManager.route = function(){
    return 'user';
}

UserManager.routeMapping = function () {
        return {
        "add": this.Create
      }
}

UserManager.Run = function(Data){
    var runMe = Data[0];
    var mappings = this.routeMapping();
    return mappings[runMe]();
}

console.log(UserManager.Run(["add"]))

请注意routingMapping是如何返回所需数据的函数。这一更改允许您使用

必须是
用户管理器
必须是
用户管理器
,以便我在使用此项时更好地理解我的错误。创建基本上是尝试引用“UserManager.routeMapping.Create”,它显然不存在?正确。我将更新我的答案,我认为你可能真的很想做。让我知道它是否有意义。最初的答案提供了我需要的确切解决方案,但很高兴知道我可以使用函数使“this”可访问。只是为了更好地理解我的错误,当我使用它时。Create基本上是指“UserManager.routeMapping.Create”,它显然不存在?正确。我将更新我的答案,我认为你可能真的很想做。让我知道它是否有意义。最初的答案提供了我所需要的确切解决方案,但很高兴知道我可以使用一个函数来访问“this”。