__proto__ 适用于 IE9 或 IE10

问题描述 投票:0回答:5

是否有可能在 IE9 或 IE10 中更改对象的

__proto__
属性? 还是 MS 还不打算将其包含在他们的 JS 引擎中?

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

__proto__
进行更改。

javascript internet-explorer prototype
5个回答
12
投票

__proto__
将在 ES6 中标准化。它目前位于ES6 草案的附录 B 中,这实际上意味着如果它被实现,它需要具有以下语义。

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

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

var p = {a: 1};
var o = {
  __原型__:p,
  乙:2
}

ES6还引入了

Object.setPrototypeOf
(不在附录中)。这比设置
__proto__
更可取。

__proto__
适用于所有现代浏览器,包括 Internet Explorer 11


2
投票

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


1
投票

不回答作为最后的手段:

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

{
   a: 17,
   __proto__: { ... }
}

{
   a: 17,
   proto: {...}
}

0
投票

我不确定你到底想要什么,因为你的问题没有具体说明,但对于 proto 的大多数用途,你应该能够使用

prototype

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

0
投票

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 以及其他属性描述符(例如可枚举性)。

© www.soinside.com 2019 - 2024. All rights reserved.