Userscript - 用函数替换变量的属性

时间:2013-10-09 00:16:56

标签: javascript userscripts

网站包含以下代码:

    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来运行我的用户脚本。

2 个答案:

答案 0 :(得分:1)

如果您使用s将名称更改为Items并将方法中的窗口删除为Items.give_to_player = function(a,b){ console.log('Change occured');};,则第二种方法将起作用。

编辑:var中的var 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 

答案 1 :(得分:-1)

我真的不知道代码的其余部分是什么样的(如果该对象在某个特定范围内,深度嵌套或者是什么)但是如果Items对象在全局范围内,则可以定义AFTER该对象(和它的属性定义)再次该属性,它应该覆盖前一个属性:

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

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