使javascript文字继承自不同的原型

时间:2014-03-10 09:14:30

标签: javascript eval literals

我有一些代码可能违背了什么是好的做法。但是,这不是我想要评论的内容 - 这纯粹是学术性的。

<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继承?

1 个答案:

答案 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')");