我有一些代码可能违背了什么是好的做法。但是,这不是我想要评论的内容 - 这纯粹是学术性的。
<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>
在评估someCode时创建的此数组继承自运行代码的顶级Array,而不是继承自fakeContext.Array
。意味着数组x没有原型函数.remove()
我如何(如果有办法)让someCode
- 字符串中的文字从fakeContext
s Array.prototype
继承?
答案 0 :(得分:0)
问题是数组文字[]
的评估方式与new Array()
不同。第一个将创建一个本地Array
对象,而第二个将检查Array
变量的范围并将其作为构造函数执行。
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')");