Метод extends довольно распространен среди библиотек JavaScript и обычно представляет собой метод, который просто позволяет потребляющему коду добавлять все «собственные» свойства и методы одного или нескольких объектов в целевой объект.Код обычно довольно прост: перебирайте все собственные ключи каждого аргумента, кроме первого, и копируйте значение, сохраненное там, в первый аргумент.
«Mixin» относится к шаблону проектирования, в котором вы используете один объекткак своего рода контейнер для определенного набора свойств и методов, которые вы хотите использовать для множества объектов в вашей системе.Например, у вас могут быть средства получения и установки ширины и высоты, которые могут применяться ко всем компонентам пользовательского интерфейса в вашем приложении, и поэтому вы должны создать, в случае JavaScript, либо функцию, для которой можно создать экземпляр «new», либо литерал объекта, которыйдержит эти методы.Затем вы можете использовать функцию типа "extends", чтобы скопировать эти методы на любое количество объектов в вашей системе.
В Underscore есть метод mixin, который по сути является просто расширением, где все переданные в объектах методы являютсядобавлен базовый объект подчеркивания для использования в цепочке.jQuery делает то же самое с методом расширения jQuery.fn.
Лично мне нравится сохранять расширение как есть, поведение типа «копировать все из этих объектов в этот объект», имея отдельный метод mixin, который вместо этогопринимает только один исходный объект, а затем обрабатывает все дальнейшие аргументы как имена свойств и методов для копирования (если передаются только цель и источник без дополнительных аргументов, тогда он просто действует как расширение из одного источника).
например
function mixin(target, source) {
function copyProperty(key) {
target[key] = source[key];
}
if (arguments.length > 2) {
// If there are arguments beyond target and source then treat them as
// keys of the specific properties/methods that should be copied over.
Array.prototype.slice.call(arguments, 2).forEach(copyProperty);
} else {
// Otherwise copy all properties/methods from the source to the target.
Object.keys(source).forEach(copyProperty);
}
}