В начале статьи вы используете следующую функцию для копирования содержимого объекта todo в новый экземпляр:

return function(todo){
    let newTodo = Object.create(todoPrototype);
    Object.assign(newTodo, todo);
    return newTodo;
  }

Хотя это работает для предложенного вами примера, это может сбить с толку менее опытных программистов JavaScript. Object.assign() использует методы получения и установки и копирует только перечислимые свойства. В примере также игнорируется тот факт, что Object.create() уже имеет правильно реализованную функциональность, которую вы добавили с помощью Object.assign().

Object.create() фактически принимает два параметра. Первый, как вы утверждаете, - это объект-прототип. Второй аргумент - это объект свойств для копирования во вновь созданный экземпляр. Поскольку он использует дескрипторы свойств, он правильно копирует геттеры и сеттеры, а также неперечислимые свойства. Я думаю, что приведенную выше функцию можно было бы более оправданно и «правильно» записать как:

return todo => Object.create(todoPrototype, Object.getOwnPropertyDescriptors(todo));

Мое решение не включает ключи с символьными значениями, но это можно исправить с помощью небольшого дополнительного кода и использования Object.getOwnPropertySymbols().

Object.assign() полезно, но может обмануть неосторожных, когда используются более сложные объекты. Более современным синтаксическим синонимом для Object.assign() является оператор распространения объекта: Object.create(todoProperty, {...todo}) но оператор распространения объекта работает точно так же, как Object.assign(), и наследует те же не столь очевидные недостатки.

Спасибо за статью.