Я все еще очень новичок в JavaScript (хотя и не в кодировании), так что не стесняйтесь придираться и придираться ко мне.
Я попытался создать что-то, что будет принимать пользовательский ввод. Если первым символом является восклицательный знак, он попытается создать объект с таким именем и запустить метод «действие» этого объекта. В противном случае он будет относиться к нему как к обычному тексту (на данный момент предупреждение)
<script type="text/javascript">
function GetInput(input){
// Trim the spaces off the beginning and end
input = input.trim();
if(input.charAt(0) != "!"){
// Just some normal text
alert(input);
return true;
}
/* Cut off the exclamation point, replace multiple spaces with one,
* and get the arguments if any. args[0] = the command. */
var args = input.substr(1).replace(/\s{2,}/g, " ").split(" ");
// Make sure the function is an object with a method named "action"
if(eval("typeof "+args[0]+";") === "function"
&& eval("typeof "+args[0]+".prototype.action;") === "function"){
eval("var command = new "+args[0]+"();");
command.action(args);
}else{
alert('"'+args[0]+'" is not a command.');
}
return true;
}
</script>
Единственная проблема, которую я замечаю, это операторы eval. Я знаю, что мог бы использовать переключатель/кейс и отказаться от eval вместе или даже создать массив, содержащий имена разрешенных функций, и сравнить ввод с этим массивом до eval, но я уверен, что должен быть лучший способ .
Я просто хочу иметь возможность создавать объект и метод и ничего не обновлять (я считаю, что это одно из основных применений утиной печати?). Возможно ли это без eval? Если нет, есть ли простой способ очистить ввод для строк, чтобы избежать таких вещей, как «!eval(alert('u b haxed'))
» или «!a;alert('u b haxed')
»?
заранее спасибо