Прототип наследования: Object.create против Object.assign - PullRequest
0 голосов
/ 26 апреля 2018

Я сейчас читаю книгу Кайла Симпсона «Ты не знаешь Дж.С.», пытаясь понять всю модель прототипа.

В нем говорится, что мы можем достичь наследования прототипов между 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);

, так что прототип Бар указывает на объект, прототип которого Foo.prototype.

Мне было интересно, почему бы нам просто не сделать это:

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

Мы достигли того же результата, и теперь у нас есть один уровень поиска цепочки прототипов для всех методов вместо двух.

1 Ответ

0 голосов
/ 26 апреля 2018

Мы достигаем того же результата

Нет, мы не делаем. Bar.prototype тогда не будет наследоваться от Foo.prototype, вместо этого он будет иметь свои собственные свойства. Конечно, значения из Foo.prototype будут скопированы, но это всего лишь снимок из Foo.prototype с момента вызова Object.assign вместо действующего соединения.

...