原型继承:Object.create vs Object.assign

时间:2018-04-26 19:56:31

标签: javascript prototype prototypal-inheritance

我目前正在阅读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);

我们实现了相同的结果,现在我们为所有方法提供了一个级别的原型链查找,而不是两个。

1 个答案:

答案 0 :(得分:1)

  

我们实现了相同的结果

不,我们没有。 Bar.prototype然后继承自Foo.prototype,而是拥有自己的属性。当然,来自Foo.prototype的值会被复制,但这只是Foo.prototype的{​​em>快照,而不是实时连接Object.assign。< / p>