-1

一个网站有以下代码:

    var Items = {
        drop: function (a, b, d) {
            if (!(typeof a == "undefined" || typeof sockets[a.id] == "undefined")) {
                SSocket.send(sockets[a.id], {
                    action: "item_drop",
                    data: {
                        id: d
                    }
                });
                Inventory.add(a, d)
            }
        },
        give_to_player: function (a, b) {
            Items.drop(a, void 0, b)
        },
        take_from_player: function (a, b) {
            var d = clients[a];
            Inventory.remove(d, b);
            Player.send_inventory(d.id)
        },
    };

我正在尝试使用用户脚本将 give_to_player 属性替换为我自己的函数。但是,我这样做的运气为零。我熟悉javascript注入和变量范围。

我尝试了以下方法:

Object.defineProperty(window.Item, 'give_to_player', {
    value:
        function(a,b){
            console.log('Change occured');
        }
});

这不会产生任何错误,但是更改不会生效并且控制台保持为空。我也尝试过 Object.defineProperties,但没有运气。

最后,以下代码也未能产生结果:

window.Item.give_to_player = function(a,b){ console.log('Change occured');};

有没有人有什么建议?

我正在使用 Chrome 来运行我的用户脚本。

4

2 回答 2

1

Items如果您将名称更改为with as 并将方法中的窗口拖放到 just ,则第二种方法将起作用Items.give_to_player = function(a,b){ console.log('Change occured');};

编辑:varinvar Items使该方法无法通过窗口范围访问。如果 var 被删除,这window.Items.give_to_player不会引发错误,但因为它在那里你不需要使用 Items 前面的窗口。(如果这有意义的话)

JSFIDDLE

旁注:你的错误

window.Items.give_to_player = function(a,b){ console.log('Change occured');};

// Uncaught TypeError: Cannot set property 'give_to_player' of undefined 
于 2013-10-09T01:00:25.497 回答
-1

我真的不知道其余代码的样子(如果该对象在某个特定范围内,深度嵌套或什么),但如果Items对象在全局范围内,您可以在该对象(及其属性定义)之后再次定义该属性这应该覆盖前一个:

Items.give_to_player: function () {
    //write your own function
}

但我不确定只要我的信息这么少,这是否会奏效。

于 2013-10-09T00:27:18.997 回答