Javascript hasOwnProperty在Google Chrome下无效

时间:2010-04-04 10:42:16

标签: javascript google-chrome properties

我目前正在开展一个项目并提供一些帮助,并且一直顺利进行,直到此事件发生。

  function runCommand(commandString)
  {
   commands = new Object();
   commands.clear = function(){ $('#terminal').html('') }

   parameters = commandString.split(" ");
   command = parameters.shift();
   if( commands.hasOwnProperty(command)){
    commands[command](parameters);
   }
   else
   {
    $('#terminal').append(command+' command not recognized.'+'<br>');
   }
  }

帮助我的人发挥了这个功能,所以我可以运行我需要处理的“类似终端”的浏览器。

使用Firefox时工作正常,这是一个例子:

guest@shell:/$ sudo make me sandwich
sudo command not recognized.
guest@shell:/$ clear

*clears*

guest@shell:/$ clear

但是在Google Chrome下会发生这种情况:

guest@shell:/$ sudo make me sandwich
sudo command not recognized.
guest@shell:/$ clear
clear command not recognized.

我认为它与“commands.hasOwnProperty(command)”有关,阻止它正常工作。

我正在使用JQuery javascript库来构建网站,我需要知道如何解决这个问题,或者替代方案。

5 个答案:

答案 0 :(得分:2)

非常高度怀疑Chrome对hasOwnProperty有任何问题,但在任何一种情况下我都清理了你的代码并将hasOwnProperty检查更改为typeof检查,这也应该稍微强一些:

var runCommand = (function () {
    var terminal = $('#terminal');

    var commands = {
        clear: function () {
            terminal.html('');
        }
    };

    return function (commandString) {
        var parameters = commandString.split(" ");
        var command = parameters.shift();

        if (typeof commands[command] === "function") {
            commands[command](parameters);
        } else {
            terminal.append(command + ' command not recognized.<br />');
        }
    };
}());

...如果你很好奇,我将命令对象存储在一个闭包中,这样它只需要创建一次,而不是每次运行该函数时都被创建/销毁。显然,这显然更快。

另外,我只运行#terminal元素的单个搜索,然后将其存储在变量中并使用它。这也是为了提高性能,因为运行jQuery搜索比存储结果并重复使用它要昂贵得多。

答案 1 :(得分:1)

适用于Chrome 3.0.195.38。

我从未听说过Chrome中的hasOwnProperty有任何问题。我怀疑你的问题出在其他地方。完整的测试案例?你是怎么读这些命令的?您是否有可能在Chrome中获得具有领先空白的命令?

你应该记得将函数中的局部变量(commandsparameters等)声明为var,否则你会得到意外的全局变量,这会产生奇数和难以-debug错误,虽然我怀疑这是问题所在。

答案 2 :(得分:0)

我敢打赌,问题在于Firefox和Chrome之间“分裂”的工作原理存在差异。我会尝试更改获取参数和命令的方式:

var command = commandString, parameters = [];
if (/ /.test(command)) {
  parameters = command.split(' ');
  command = parameters[0];
  parameters = parameters.slice(1);
}

编辑第二个想法应该没有区别;据我所知,Safari应该处理简单的“分裂空间”的事情就好了。确保在该代码周围添加一些调试,以查看当函数认为在对象中找不到“清除”时的“命令”。正如@bobince所说,使用var 定义您的变量!!!!

答案 3 :(得分:0)

function runCommand(commandString) {
    var terminal = $('#terminal'), //cached to reduce calls to jQuery
    commands = {    //start object literal, continue var statement
        clear: function (){ 
            terminal.html(''); 
        }
    },
    parameters = commandString.split(' '),
    command = parameters.shift(); //end var statement
    if (commands.hasOwnProperty(command)) {
        commands[command].call(parameters);
        console.log(command + ' command sent.'); //output for testing
    } else {
        terminal.append(command + ' command not recognized.<br>');
        console.warn(command + ' command not recognized.'); //output for testing
    }
}

答案 4 :(得分:0)

在DOM Object实例上使用hasOwnProperty现在将返回false

More info..