Конкатенативное наследование и функциональное наследование. Код внутри - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь понять следующий код, который появляется в Eri c средний блог Эллиота (https://medium.com/javascript-scene/3-different-kinds-of-prototypal-inheritance-es6-edition-32d777fa16c9)

import Events from 'eventemitter3';

const modelMixin = Object.assign({
  attrs: {},
  set (name, value) {
    this.attrs[name] = value;

    this.emit('change', {
      prop: name,
      value: value
    });
  },

  get (name) {
    return this.attrs[name];
  }
}, Events.prototype);


const george = { name: 'george' };
const model = Object.assign(george, modelMixin);

model.on('change', data => console.log(data));

model.set('name', 'Sam');
/*
{
  prop: 'name',
  value: 'Sam'
}
*/

имеет ли смысл составлять model объект с экземпляром george? Я имею в виду, что после запуска const model = Object.assign(george, modelMixin); модель выглядит примерно так:

attrs:{}
get:function get(name){}
name: 'george' 
set:function set(name,value){}

, и когда выполняется model.set('name', 'Sam');, свойство name добавляется в атрибут attrs, а не в root, поэтому model.name всегда будет george.

Внутри той же статьи он продолжает с тем же примером кода для функционального наследования, но теперь он добавляет rawMixin

import Events from 'eventemitter3';

const rawMixin = function () {
  const attrs = {};

  return Object.assign(this, {
    set (name, value) {
      attrs[name] = value;

      this.emit('change', {
        prop: name,
        value: value
      });
    },

    get (name) {
      return attrs[name];
    }
  }, Events.prototype);
};

const mixinModel = (target) => rawMixin.call(target);

const george = { name: 'george' };
const model = mixinModel(george);

model.on('change', data => console.log(data));

model.set('name', 'Sam');

Он сделал вышеуказанный комментарий Note in the example above, we have the 'mixinModel()' wrapper around the actual functional mixin, 'rawMixin()'. The reason we need that is because we need to set the value of 'this' inside the function, which we do with 'Function.prototype.call()'. We could skip the wrapper and let callers do that instead, but that would be obnoxious.

Опять же, у меня тот же вопрос, потому что он добавляет свойство name в root объекта модели, а не внутри атрибута attr.

имеет ли смысл в обоих случаях использовать объект george с Object.assign()?

...