【问题标题】:Prototypal inheritance: Object.create vs Object.assign原型继承:Object.create vs Object.assign
【发布时间】:2018-04-27 04:23:11
【问题描述】:

我目前正在阅读 Kyle Simpson 的《你不懂 JS》,试图理解整个原型模式。

它说我们可以实现 Foo 和 Bar 之间的原型继承,如下所示:

      function Foo(name) {
        this.name = name;
      }
      
      Foo.prototype.myName = function () {
        return this.name;
      };
      
      function Bar(name, label) {
        Foo.call(this, name);
        this.label = label;
      }
      
      // here, we make a new `Bar.prototype`
      // linked to `Foo.prototype`
      Bar.prototype = Object.create(Foo.prototype);
      
      // Beware! Now `Bar.prototype.constructor` is gone,
      // and might need to be manually "fixed" if you're
      // in the habit of relying on such properties!
      
      Bar.prototype.myLabel = function () {
        return this.label;
      };
      
      var a = new Bar("a", "obj a");
      
      console.log(a.myName()); // "a"
      console.log(a.myLabel()); // "obj a"

我明白链接是在该行中建立的

Bar.prototype = Object.create(Foo.prototype);

因此 Bar 的原型指向一个原型为 Foo.prototype 的对象。

我想知道为什么我们不这样做:

Bar.prototype = Object.assign({}, Foo.prototype);

我们获得了相同的结果,现在我们对所有方法都进行了一级原型链查找,而不是两级。

【问题讨论】:

  • 你如何认为Object.assign 的原型链更短?
  • @ScottMarcus 你可以用Object.assign 运行sn-p ????
  • 它可能低一级,但它不是同一个对象 - 更改 Foo.prototype 中的内容不会反映在您分配的原型上。
  • @destoryer 这不是,我同意。但我是说它产生了完全相同的继承效果。
  • 如果你要在Foo.prototype上添加一个函数,你将无法使用它。

标签: javascript prototype prototypal-inheritance


【解决方案1】:

我们得到了同样的结果

不,我们没有。然后Bar.prototypeFoo.prototype 继承,而是拥有自己的属性。当然,Foo.prototype 中的值会被复制,但这只是Foo.prototype快照,从调用Object.assign 开始,而不是实时连接。

【讨论】:

  • 那么,您会说在我不更改时使用Object.assign 更好吗,例如在运行时使用Foo? (如果继承是我的目标,我认为主要是这种情况)。
  • 不,不会更好。复制属性需要更多内存,并且不允许引擎像继承那样优化方法调用。
猜你喜欢
  • 1970-01-01
  • 2016-02-15
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多