2016-02-25 215 views
0

我是新来的节点,只是试图使用process.argv调用正确的对象上的方法,但我不断收到一个错误,它不能读取undefined属性。Node.js - 使用变量作为对象名称来调用方法

// returns with undefined error 
var stops_input = process.argv[3]; 
this[process.argv[3]].displayStops(); 

// hard-coding object name works with the method: 
N.displayStops(); 

// displayStops method 
this.displayStops = function(){ 
    string = ""; 

    stops.forEach(function(i){ 
    if (i === stops[stops.length -1]) { 
     string += i; 
    } else { 
     string += i + ", "; 
    } 
    }); 

    console.log(this.name + " train stops: " + string); 
} 

感谢您的关注。有关如何使用节点终端控制台中的变量调用对象的任何想法?

+0

你尝试'这个[process.argv [3]()' – adeneo

+0

这个[process.argv [3]()displayStops()。抛出我这个错误: TypeError:this [process.argv [3]]不是函数 –

+2

很难说出这里发生了什么。'N'是一个带有displayStops()方法的对象吗?在这种情况下,“N”是否是“this”引用的任何对象的属性?当你从命令行运行你的程序('process.argv [3]'应该是第二个参数)时,你传递的第二个参数是'N'?或者'N'是一个自由浮动的变量(在这种情况下,你不能做你正在做的事情,但有解决方法)? – McMath

回答

0

尝试使用global代替this ...

global[process.argv[3]].displayStops(); 

这假定N是传递给该节点脚本的第二个参数,而且它在全球范围中,并且具有displayStops附着的方法它。

0

我会做以下事情。

// Your argument from the commandline (faked for your pleasure) 
var method = 'xxx' 

// 1. Create a function as normal 
function xxx() { 
    return 'xxx' 
} 

// 1. Create a reference to it 
var callable = {xxx: xxx} 

// 1. Call it 
callable[method]() 

,看看有什么在你的背景:

console.log(this); // {} 
console.log(global.xxx); // undefined 
console.log(Object.keys(global)); // Run to see the list 

如果你想坚持this,改变这种:

this[process.argv[3]]().displayStops() 

要这样:

this[process.argv[3]]() 

的前者相当于:

this['displayStops']().displayStops() 

但你想要的以后,这相当于:

this['displayStops']() // The same as calling this.displayStops() 
+2

'callable [method]()' –

+0

已更新。谢谢! –

0

I am new to node and just trying to use the process.argv to call a method on the correct object, but I keep getting an error it cant read property of undefined.

process.argv将返回的参数

所以你调用数组

node program.js 1 2 3 

在终端

var params = process.argv; 
console.log(params); 

你会得到

[node, path/to/program.js, someMethod, 2, 3] 

假设你传递的第一个参数是一个对象

var firstParam = process.argv[2]; 

现在,如果你有一个方法定义的对象...

var obj = { 
    someMethod : function() { 
     console.log("Hello");    
    } 
} 

你可以这样调用这个方法

obj["someMethod"](); 
obj[firstParam](); 
obj.someMethod(); 

他们都应该产生 “你好”

相关问题