gpt4 book ai didi

javascript - 绕过 IE9 和 IE10 中的 __proto__ 限制

转载 作者:行者123 更新时间:2023-12-03 10:58:46 25 4
gpt4 key购买 nike

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 对象上构建原型(prototype)链(就像通常在对象的原型(prototype)链上所做的那样。

问题是: __proto__ 属性在 IE9 和 IE10 中是不可变的,遗憾的是,我确实需要与这些浏览器兼容。此外:

  1. 我不能使用任何第三方。我需要一个功能齐全、不依赖于其他任何东西的代码。
  2. 如您所见,randomMethod 是在创建函数后添加的。我确实需要原型(prototype)链接,就像在我的场景中一样,这个对象将在函数创建后修改。简单地在函数原型(prototype)上复制 oCommonFunctionProto 属性是行不通的。
  3. 只要它能完成工作,我就完全可以接受次优的代码。这将是一个仅针对 IE9/IE10 的兼容性破解。只要它能完成工作,我就很高兴。
  4. 可以在函数创建时设置__proto__。如果我能事后做就更好了,但如果我别无选择,这也是可以接受的。

我尝试了所有可能的方法,但没有找到任何方法来绕过 IE9/IE10 上的此限制。

TL;DR:我必须能够在 IE9 和 IE10 中无需任何第三方的帮助即可在 JavaScript 函数上设置 __proto__

最佳答案

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

我最终放弃了原型(prototype)链,无论是对象还是函数,转而采用扁平化原型(prototype),并在逻辑“父”原型(prototype)发生变化时发出通知,以相应地更新“子”原型(prototype)。

关于javascript - 绕过 IE9 和 IE10 中的 __proto__ 限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28176334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com