Кажется, что ни один из ответов не работает так же хорошо, как iframe.Я вполне убежден, что тюрьма iframe будет решением проблемы.Я помещаю свое текущее решение в качестве ответа, потому что оно, кажется, работает лучше, чем другие ответы, предоставленные до сих пор.Мне бы очень хотелось усовершенствовать эту технику iframe во что-то надежное, и я бы хотел понять, как работают модифицированные прототипы.Этот пример работает в chrome и moz.
test.js
var badA = "hahaha";
this.badB = "hehehe";
badC = "hohoho";
String.prototype.star = function(){ return '***' + this + '***' }
var somethingUseful = {
doStuff: function () {
alert((badA + badB + badC).star());
}
}
test.html
<html>
<head>
<script>
/**
safeLoad - load a script in an iframe jail
@param {String} scriptPath path to a javascript file
@param {String} target name of global object to import
@param {Function} callback function to execute after script loads
*/
function safeLoad (scriptPath, target, callback) {
var g=this, f=document.createElement('iframe'), frameIndex=frames.length;
f.style.width='0px';
f.style.height='0px';
f.style.border='none';
f.style.position='absolute';
f.onload=function(){
var w=frames[frameIndex];
var s=w.document.createElement('script');
s.src=scriptPath;
s.onload=function(){
g[target]=w[target];
if (callback && callback.apply) callback(w);
};
w.document.body.appendChild(s);
}
document.documentElement.appendChild(f);
}
</script>
<script>
safeLoad('test.js', 'somethingUseful', function init () {
// next line should give ***hahahahehehehohoho***
somethingUseful.doStuff();
// next line should give undefinedundefinedundefinedundefined
alert(typeof badA + typeof badB + typeof badC + String.prototype.star);
});
</script>
</head>
</html>