В начале статьи вы используете следующую функцию для копирования содержимого объекта 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(), и наследует те же не столь очевидные недостатки.
Спасибо за статью.