网站包含以下代码:
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来运行我的用户脚本。
答案 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前面的窗口。(如果这是有意义的)
旁注:您的错误
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
}
但是,只要我的信息很少,我就不确定这是否会奏效。