__proto__已弃用。什么是快速和跨浏览器替代?

时间:2014-11-26 19:03:05

标签: javascript performance prototype-programming

如您所知,__proto__deprecated

  

MDN:   警告:不推荐使用__proto__属性,不应使用该属性。

__proto__的快速和跨浏览器替代方案是什么? 在我的情况下,我更改了函数的__proto__。所以我找不到任何替代方案。

已弃用的代码

// one time
var proto = {};
proto.bar = function (x) { return this(x) + 10; };
proto.buzz = function () { return this(4); };
// and 100 more function proto.*
proto = _.extend(proto, (function(){}).__proto__); // underscore extend function
                                                   // update: change arguments order

// many time
var foo = function (x) { return 2 * x; }
foo.__proto__ = proto;

慢替代(jsperf

// many time
var foo = function (x) { return 2 * x; };
foo.bar = function (x) { return this(x) + 10; };
foo.buzz = function () { return this(4); };
// and 100 more function foo.*

是否有快速和跨浏览器替代方案?

2 个答案:

答案 0 :(得分:2)

正如链接的MDN文章所述,Object.getPrototypeOf()是新功能。它似乎有很好的浏览器支持。对于那些不支持它的人(IE除外),你可以用__proto__来填充它。 ;)

if (!Object.getProtoTypeOf) {
    Object.getProtoTypeOf = function(obj) {
        return obj.__proto__;
    };
}

答案 1 :(得分:2)

首次使用时,您获得了某个功能的__proto__,因此您只需使用Function.prototype

proto = _.extend(Function.prototype, proto); // underscore extend function

你的第二个用途是替换一个物体上的原型,所以别无选择。

ECMAScript 6正在标准化__proto__,并且还会Object.setPrototypeOf(),因此您可以在实施后使用它们。