为了账号安全,请及时绑定邮箱和手机立即绑定

为什么突变对象的[原型]不利于性能?

为什么突变对象的[原型]不利于性能?

慕尼黑8549860 2019-07-13 14:50:20
从MDN文档中获取标准 setPrototypeOf功能以及非标准 __proto__财产:改变对象的[原型],无论这是如何实现的,都是强烈的劝阻,因为在现代JavaScript实现中,它非常缓慢,不可避免地减缓了后续的执行。使用Function.prototype添加属性是这个将成员函数添加到javascript类的方法。然后如下所示:function Foo(){}function bar(){}var foo = new Foo();// This is bad: //foo.__proto__.bar = bar; // But this is okayFoo.prototype.bar = bar;// Both cause this to be true: console.log(foo.__proto__.bar == bar); // true为什么foo.__proto__.bar = bar;坏的?如果不是坏事Foo.prototype.bar = bar;同样糟糕?那么为什么这个警告:在现代JavaScript实现中,它非常慢,不可避免地减缓了后续的执行。..当然Foo.prototype.bar = bar;也没那么糟。更新也许他们所说的突变意味着重新分配。见已接受的答案。
查看完整描述

3 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

__proto__/setPrototypeOf与分配给对象原型不同。例如,当函数/对象的成员被分配给它时:

function Constructor(){
    if (!(this instanceof Constructor)){
        return new Constructor();
    } }Constructor.data = 1;Constructor.staticMember = function(){
    return this.data;}Constructor.prototype.instanceMember = function(){
    return this.constructor.data;}Constructor.prototype.constructor = Constructor;
    // By doing the following, you are almost doing the same as assigning to
     // __proto__, but actually not the same :Pvar newObj = Object.create(Constructor);
     // BUT newObj is now an object and not a // function like !!!Constructor!!! 
     // (typeof newObj === 'object' !== typeof Constructor === 'function'), and you
      // lost the ability to instantiate it, "new newObj" returns not a constructor, 
      // you have .prototype but can't use it. newObj = Object.create(Constructor.prototype);
       // now you have access to newObj.instanceMember // but staticMember is not available. newObj instanceof Constructor is true
       // we can use a function like the original constructor to retain // functionality, like self invoking it newObj(), accessing static 
       // members, etc, which isn't possible with Object.createvar newObj = function(){
    if (!(this instanceof newObj)){   
    
        return new newObj();
    }}; newObj.__proto__ = Constructor;newObj.prototype.__proto__ = Constructor.prototype;newObj.data = 2;(new newObj()).instanceMember(); 
    //2newObj().instanceMember(); // 2newObj.staticMember(); // 2newObj() instanceof Constructor; // is trueConstructor.staticMember();
     // 1

每个人似乎只关注原型,而忘记了函数可以分配给它的成员,并在变异后实例化。目前没有其他方法可以不使用__proto__/setPrototypeOf..几乎没有人使用构造函数而不具备从父构造函数继承的能力,并且Object.create不能服务。

另外,那是两个Object.create目前,调用在V8(浏览器和节点)中非常缓慢,这使得__proto__更可行的选择


查看完整回答
反对 回复 2019-07-13
?
狐的传说

TA贡献1804条经验 获得超3个赞

是的。Prototype=同样糟糕,因此使用了“无论它如何完成”的措辞。Prototype是一个伪对象,用于在类级别扩展功能。它的动态特性减缓了脚本的执行速度。另一方面,在实例级别添加一个函数所带来的开销要小得多。


查看完整回答
反对 回复 2019-07-13
  • 3 回答
  • 0 关注
  • 380 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信