__proto__ 用于 IE9 或 IE10

Posted

技术标签:

【中文标题】__proto__ 用于 IE9 或 IE10【英文标题】:__proto__ for IE9 or IE10 【发布时间】:2012-01-14 20:34:43 【问题描述】:

是否有可能在 IE9 或 IE10 中更改对象的 __proto__ 属性? 还是 MS 仍然不打算将其包含在他们的 JS 引擎中?

我在非常特殊的情况下需要它,我需要在创建对象之后更改__proto__

【问题讨论】:

【参考方案1】:

由于您的问题没有具体说明,我不确定您到底在追求什么,但对于 proto 的大多数用途,您应该可以使用 prototype

var foo = new Bar();
//this also affects foo
Bar.prototype.baz = something;

【讨论】:

我没有指定,因为我唯一想知道的是 IE9/10 是否支持修改 proto 属性,因为它是唯一不支持的浏览器暂时支持一下。 我不明白“new Bar();”。如何使用 Object.create 重写它?【参考方案2】:

不得已,不得已:

更改您的代码,以便通过更改后的原型访问的所有属性现在都可以通过普通属性的显式委托访问:


   a: 17,
   __proto__:  ... 


   a: 17,
   proto: ...

【讨论】:

【参考方案3】:

__proto__ 将在 ES6 中标准化。它目前在Appendix B of the ES6 draft 中,这实际上意味着如果实现它,它需要具有以下语义。

__proto__ 都可以作为Object.prototype 上的访问器使用,这意味着默认情况下所有对象都可以读取和写入它。但是,它可以从Object.prototype 中删除(使用delete)。删除后,__proto__ 将作为普通数据属性使用,对设置没有副作用。

__proto__ 也是对象字面量中的一种特殊句法形式。即使Object.prototype.__proto__ 被删除,它也可以设置[[Prototype]]。

变种 p = a: 1; var o = __proto__: p, 乙:2

ES6 还引入了Object.setPrototypeOf(不在附录中)。这优于设置__proto__

__proto__ 在所有现代浏览器中都可用,including Internet Explorer 11。

【讨论】:

我希望这是真的。你知道 ES6 是否允许从 Array 高效派生吗? proto 不在标准轨道上 - 相反,ES6 批准了 Object.setPrototypeOf 以获得更好的支持 developer.mozilla.org/en-US/docs/Web/javascript/Reference/… 是的,ES6 将支持内置在原生类(如 Array)中的子类化。【参考方案4】:

__proto__ 包含在泄露的 Windows Blue 版本中的 IE11 中:http://fremycompany.com/BG/2013/Internet-Explorer-11-rsquo-s-leaked-build-395/

【讨论】:

以上是关于__proto__ 用于 IE9 或 IE10的主要内容,如果未能解决你的问题,请参考以下文章

IE10 SCRIPT5009:“__doPostBack”未定义

温故知新——JS_ ES5新特性简介

IE9的兼容性

IE9及以下版本获取上传文件的大小

对象不支持此属性或方法 -- 在 IE9 中调用 Applet

Object不支持此属性或方法 - 在IE9中调用Applet