Javascript 用户脚本初始化故障

Javascript 用户脚本初始化故障,javascript,initialization,tostring,userscripts,Javascript,Initialization,Tostring,Userscripts,现在,我正在为一个浏览器游戏使用userscript。我在沙盒和初始化方面有一些问题 作为解决方案,我找到了一种方法,创建一个新元素(脚本)并在元素中插入对象 var script = document.createElement("script"); script.type = "text/javascript"; script.innerHTML = "var Class = { ... }"; document.body.appendChild(script); 但我有一个非常大的对象,

现在,我正在为一个浏览器游戏使用userscript。我在沙盒初始化方面有一些问题
作为解决方案,我找到了一种方法,创建一个新元素(脚本)并在元素中插入对象

var script = document.createElement("script");
script.type = "text/javascript";
script.innerHTML = "var Class = { ... }";
document.body.appendChild(script);
但我有一个非常大的对象,并将其转换为字符串,这是一个非常麻烦且耗时的问题。
我有一个像这样的对象:

{
addToStorage : Function,
getFromStorage : Function,
getID : Function
settings : Object,
langs : Object,
init : Function,
version : Number,
author: String
}
任何想法,如何将其转换为字符串或插入到全局窗口

对不起,我的英语不好

使用该工具从greasemonkey沙箱中冲出

要打破Chrome的孤立环境,根据需要,您需要在DOM中插入
元素

您不应该将该脚本的源代码存储在转义字符串中,最好使用JS对象并将其字符串化。对于普通的函数,您可以使用
JSON
,对于更复杂的函数,可以将所有内容放入一个函数中,并调用
.toString()

function moduleClosure(global) {
    // do something
    return some object
}
var script = document.createElement("script");
script.type = "text/javascript";
script.innerText = "var Class = "+moduleClosure+"(window);";
document.body.appendChild(script);

在Firefox中,可以对对象使用
.toSource()
函数。因此,答案是抛弃Chrome,转而使用Firefox。(二)

但是假设您不想这样做,那么答案就会变得混乱,因为如果像您这样将对象作为函数属性,即使是
JSON.stringify()
也无法工作

因此,您可以使用注入对象源(有关各种技术,请参阅链接)

或者您可以制作或使用对象字符串生成器,如下面的
objToString
。警告,
objToString
只是一次快速而肮脏的第一次尝试,您可能更聪明地抓取类似的东西

var myObjX =  {
    someFunction:   function () {console.log ("foo");},
    settings:       {init: 2},
    langs:          {a: "En", b: "Jp"},
    version:        99,
    author:         "Anon"
}

function objToString (obj) {
    var str = '{ ';
    for (var p in obj) {
        if (obj.hasOwnProperty (p) ) {
            str += p + ': ';
            switch (typeof obj[p]) {
                case "object":
                    str += objToString (obj[p]);
                    break;
                case "string":
                    str += '"' + obj[p] + '"';
                    break;
                default:
                    str += obj[p];
                    break;
            }
            str += ',\n';
        }
    }
    return str.slice (0, str.length-2) + ' }';
}

var script          = document.createElement("script");
script.type         = "text/javascript";
script.textContent  = "var injectedX = " + objToString (myObjX);
document.body.appendChild (script);

@为什么要投否决票?注入函数代码接近Chrome用户脚本的标准实践。谢谢大家。我已经找到了解决这个问题的办法。我使用的是:
(function(fn){var script=document.createElement('script');script.setAttribute(“type”,“application/javascript”);script.textContent='('+fn+')();';document.body.appendChild(script);//运行脚本document.body.removeChild(script);//清理})(function(){//这里有任何代码})