更新:由于该问题尚未得到解答,我稍作修改。以下链接Dean博客文章的评论表明这种技术在Safari中不起作用。
我的问题是:描述的技术在现代浏览器中是否可行*,特别地,有人能证实它在Safari中是否可行吗?
这里有一篇更近期的博客文章。其中提到:
沙箱本机……受到多种浏览器的支持,包括……Safari 2.0+
但后来又说,iframe技术“被除Safari以外的所有主流浏览器支持”,并且他展示的备选方案涉及使用伪造的构造函数和__proto__
进行一些奇怪的操作,看起来有点hacky。
我几乎难以相信两个不同的窗口实际上可以共享同一个对象原型,比如Object.prototype。跨域iframe会发生什么情况?如果我在一个框架中修改了原型,另一个框架中的原型是否也会被修改?这似乎是一个显而易见的安全问题。请有人解释一下这种情况。
* “可行”指的是My.Object != Object
,因此可以在一个窗口中修改原型而不影响另一个窗口。
原始帖子
我知道以前已经问过了,但我有一个特定的解决方案,并且我想知道是否以前讨论过这种类型的解决方案,以及我在哪里可以学习它的可靠性和广泛接受程度。
问题是如何扩展javascript中的本机类型,而不实际干扰类型本身,因此仅改变Array.prototype是不好的(可能其他代码正在使用for..in与数组)。创建一个返回带有一些函数的本机数组的伪构造函数似乎也不是一个好的解决方案,实际扩展本机对象似乎更好。但是,您也无法像使用常规javascript虚拟函数原型切换样式扩展本机类型,因为当您尝试调用本机函数时会出现错误,如“push不是通用的”。
因此,我所考虑的解决方案是:创建另一个窗口,在该窗口的本机构造函数的原型中添加功能,并在程序中使用这些构造函数。
此示例将Array
扩展为带有each
函数的My.Array
以及将String
扩展为带有alert
函数的My.String
。
var My = (function(){
// create an iframe to get a separate global scope
var iframe = document.createElement('iframe');
iframe.style.height = '0px';
iframe.style.width = '0px';
iframe.style.border = 'none';
iframe.style.position = 'absolute';
iframe.style.left = '-99999px';
document.documentElement.appendChild(iframe);
var My = iframe.contentWindow;
My.String.prototype.alert = function(){
alert(this);
}
My.Array.prototype.each = function(callback){
for (var i=0, l=this.length; i<l; i++) {
callback(this[i], i);
}
}
return My;
}());
我的问题是这种方法以前是否被讨论过,它被称为什么,在哪里可以找到更多信息等等。我想知道除了使用iframe之外是否有更清晰的方法来获取另一个全局作用域,或者在某些javascript引擎中可能因为某些原因而失败,或者是否有人认为这是一个特别糟糕的想法。
更新:我想人们称这种方法为< b > iframe沙盒 ,不要与HTML5 iframe沙盒属性混淆。
相关:
http://dean.edwards.name/weblog/2006/11/hooray/
http://webreflection.blogspot.com/2008/03/javascript-arrayobject.html
this
,你可以使用call
或apply
。 - zzzzBov