是否有可能在 IE9 或 IE10 中更改对象的
__proto__
属性?
还是 MS 还不打算将其包含在他们的 JS 引擎中?
我在非常特殊的情况下需要它,我需要在创建对象之后
__proto__
进行更改。
__proto__
将在 ES6 中标准化。它目前位于ES6 草案的附录 B 中,这实际上意味着如果它被实现,它需要具有以下语义。
__proto__
都可用作 Object.prototype
上的访问器,这意味着默认情况下所有对象都可以读取和写入它。但是,可以将其从 Object.prototype
中删除(使用 delete
)。删除后,__proto__
将作为普通数据属性使用,对设置没有副作用。
__proto__
也是对象字面量中的一种特殊语法形式。即使删除了Object.prototype.__proto__
,也可以设置[[原型]]。
var p = {a: 1}; var o = { __原型__:p, 乙:2 }
Object.setPrototypeOf
(不在附录中)。这比设置__proto__
更可取。
__proto__
适用于所有现代浏览器,包括 Internet Explorer 11。
__proto__
包含在 Windows Blue 泄露版本中的 IE11 中: http://fremycompany.com/BG/2013/Internet-Explorer-11-rsquo-s-leaked-build-395/
不回答作为最后的手段:
更改代码,以便最初通过更改后的原型访问的所有属性现在都可以通过普通属性上的显式委托来访问:
{
a: 17,
__proto__: { ... }
}
到
{
a: 17,
proto: {...}
}
我不确定你到底想要什么,因为你的问题没有具体说明,但对于 proto 的大多数用途,你应该能够使用
prototype
。
var foo = new Bar();
//this also affects foo
Bar.prototype.baz = something;
IE 9 和 10 不支持设置已创建对象的原型,但是有一个可以在 IE 9 和 10 中工作的 hack:
// An alternative to Object.setPrototypeOf() for IE 9 and 10
function addPrototypeTo(obj, prototype) {
if (obj==null || !/c/.test(typeof prototype)) {// /c/ matches function and object
// Throw if obj is nullish or prototype is neither an object nor null
throw new TypeError;
}
if (/c/.test(typeof obj)) {// if obj is an object
for (var prop, keys = Object.getOwnPropertyNames(prototype), length = keys.length, i = 0; i<length; i++) {
if (!Object.hasOwnProperty.call(obj, prop = keys[i])) {
Object.defineProperty(obj, prop, Object.getOwnPropertyDescriptor(prototype, prop));
}
}
}
return obj;
}
上面的函数是一个 hack,它只是从原型对象复制所有属性并在另一个对象上定义它们,而不覆盖任何冲突的属性名称。由于它使用
Object.getOwnPropertyDescriptor()
和 Object.defineProperty()
,因此会维护 getter 和 setter 以及其他属性描述符(例如可枚举性)。