你好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中是不可变的,遗憾的是,我真的需要与这些浏览器兼容。 而且:
我尝试了每次攻击,但没有找到任何方法绕过IE9 / IE10上的限制。
TL; DR:我必须能够在没有IE9和IE10中任何第三方帮助的情况下在javascript函数上设置 __ proto __ 。
答案 0 :(得分:1)
基于其他答案和讨论,似乎这对IE< 11来说是不可能的。
我最终删除了原型链,无论是对象还是函数,都支持扁平原型和通知,当逻辑“父”原型发生变化时,相应地更新“子”原型。