使javascript文本从不同的原型继承
我有一个可能与良好实践背道而驰的代码。然而,这不是我想要评论的——这纯粹是学术性的使javascript文本从不同的原型继承,javascript,eval,literals,Javascript,Eval,Literals,我有一个可能与良好实践背道而驰的代码。然而,这不是我想要评论的——这纯粹是学术性的 <html> <head> <script> function run() { var fakeContext = { Array : fr.contentWindow.Array || fr.Array; //Another context/window array } fakeContext.Array.prototype.rem
<html>
<head>
<script>
function run() {
var fakeContext = {
Array : fr.contentWindow.Array || fr.Array; //Another context/window array
}
fakeContext.Array.prototype.remove = function(el) {/*some code*/};
with (fakeContext) {
var someCode = "var x = ['1', '2']; x.remove('2')";
eval(someCode);
}
}
</script>
</head>
<body>
<iframe src="about:blank" name="fr"></iframe>
</body>
</html>
函数运行(){
var fakeContext={
数组:fr.contentWindow.Array | | fr.Array;//另一个上下文/窗口数组
}
fakeContext.Array.prototype.remove=函数(el){/*一些代码*/};
有(伪造背景){
var someCode=“var x=['1','2'];x.remove('2');
eval(someCode);
}
}
在计算someCode时创建的此数组继承自代码运行所在的顶级数组,而不是继承自fakeContext.array
。表示数组x没有原型函数.remove()
我如何(如果有办法)获取
someCode
-字符串中的文本以从fakeContext
s数组继承。prototype
问题在于数组文本[]
的计算方式与新数组()的计算方式不同。第一个将只创建一个本机数组
对象,而第二个将检查数组
变量的作用域并将其作为构造函数执行
var fakeWin = fr.contentWindow || fr;
var fakeContext = {Array: fakeWin.Array};
with (fakeContext) {
Array.prototype.remove = function(el) {/*some code*/};
eval("var x = new Array('1', '2'); x.remove('2')");
}
要使用不同上下文中的原型创建数组,您需要eval
假窗口环境中的文本:
var fakeWin = fr.contentWindow || fr;
with (fakeWin) {
Array.prototype.remove = function(el) {/*some code*/};
eval("var x = new Array('1', '2'); x.remove('2')");
}
// or:
fakeWin.Array.prototype.remove = function(el) {/*some code*/};
fakeWin.eval("var x = new Array('1', '2'); x.remove('2')");
首先,您有几个语法错误。第二行:不能指定内部对象文字;在第7行:应该是和,JS中的关键字区分大小写。更正,感谢您指出。这看起来应该有效。可能是平台问题?你想做什么?为什么需要一个“假”数组类?我有代码来进一步解释这个问题。我试图在另一个上下文中运行一些代码。除了对数字、布尔值、字符串、数组等文本进行原型化之外,其他一切都很好。这将适用于我的情况,但是,我们偶尔会评估一些相当大的脚本,这需要花费一些时间来替换脚本中的所有文本。我没有说您需要替换它们。但你说这个问题纯粹是学术性的?为了生产,你应该考虑一个更好的方法。