绕过IE9和IE10中的__proto__限制

时间:2015-01-27 17:25:37

标签: javascript prototype

你好Javascript忍者!我有一个非常难以解决的问题,并没有找到任何令人满意的解决方案。

对于我正在开发的非常具体的Javascript框架,我需要能够设置动态创建的函数的 __ proto __ 属性。我有一些通用的函数工厂,需要对创建的函数有共同的定义。 我不想争论是否这是一个好习惯,因为我真的需要以完全正当的理由来实现这一点。

这是一个小型的QUnit示例,可以在Chrome最新版本上完美运行,显示我需要的内容:

var oCommonFunctionProto = {};
var fnCreateFunction = function () {
    var fnResult = function () {};
    fnResult.__proto__ = oCommonFunctionProto; // DOES NOT WORK WITH IE9 OR IE10
    return fnResult;
};
var fn1 = fnCreateFunction();
oCommonFunctionProto.randomMethod = function() { return 10; };
equal(fn1.randomMethod(), 10, "__proto__ has been set properly");
var oInstance = new fn1(); // fn1 is instantiable

正如您在此代码中看到的,添加到oCommonFunctionProto的任何内容都可以直接在fnCreateFunction方法返回的任何函数上使用。这允许在Function对象上构建原型链(就像它经常在对象的原型链上完成一样。

问题在于: __ proto __ 属性在IE9和IE10中是不可变的,遗憾的是,我真的需要与这些浏览器兼容。 而且:

  1. 我不能使用任何第三方。我需要一个不依赖于其他任何东西的功能齐全的代码。
  2. 如您所见,在创建函数后添加了 randomMethod 。我真的需要在我的场景中进行原型链接,这个对象将在功能创建后进行修改。简单地复制函数原型上的oCommonFunctionProto属性将不起作用。
  3. 只要能完成工作,我就完全可以使用次优代码。这将是IE9 / IE10的兼容性攻击。只要它完成这项工作,我会很高兴。
  4. 可以在创建函数时设置 __ proto __ 。如果我之后能够做到这一点会更好,但如果我别无选择,这是可以接受的。
  5. 我尝试了每次攻击,但没有找到任何方法绕过IE9 / IE10上的限制。

    TL; DR:我必须能够在没有IE9和IE10中任何第三方帮助的情况下在javascript函数上设置 __ proto __

1 个答案:

答案 0 :(得分:1)

基于其他答案和讨论,似乎这对IE< 11来说是不可能的。

我最终删除了原型链,无论是对象还是函数,都支持扁平原型和通知,当逻辑“父”原型发生变化时,相应地更新“子”原型。