Миксины(примеси) в es6?

169
14 января 2019, 21:10

Изучил миксины в es5 (т.е. через самописную функцию)

var extend = function(target) { // get target [0] and mixins
    if(!arguments[1]) { // if no mixins in arguments[]
        return; // quit
    }
    for(i=1; i < arguments.length; i++) { // skip [0] as its the target
        var source = arguments[i]; // get current mxin
        console.log(source);
        for(var prop in source) { // inner loop with current mixin
            if(!target[prop] && source.hasOwnProperty(prop)) { // antiduplicate
                target[prop] = source[prop]; // assign each
            }
        }
    }
};

теперь изучаю es6 и правильно я понимаю что в нем уже не используются самописные функции для миксинов, и есть внутренняя функция для примесей?

Answer 1

В самом языке миксинов нет, но вместо

var extend = function(target) { // get target [0] and mixins 
    if(!arguments[1]) { // if no mixins in arguments[] 
        return; // quit 
    } 
 
    for(i=1; i < arguments.length; i++) { // skip [0] as its the target 
        var source = arguments[i]; // get current mxin 
 
        // console.log(source); 
 
        for(var prop in source) { // inner loop with current mixin 
            if(!target[prop] && source.hasOwnProperty(prop)) { // antiduplicate 
                target[prop] = source[prop]; // assign each 
            } 
        } 
    } 
}; 
 
var obj = { 
  a: 5 
} 
 
extend(obj, { b: 6}) 
 
console.log(obj)

Можно написать:

function extend (obj) { 
  Object.assign(obj, ...arguments) 
 
} 
 
let obj = { 
  a: 5 
} 
 
extend(obj, { b: 6}, { c: 7, d: { a: 8 } }) 
 
console.log(obj)

Но как тут так и у Вас идет мутирование оригинального объекта, плохая практика, нужно возвращать новый объект.

const oldObj = { 
  a: 5 
} 
 
const newObj = extend(oldObj, { b: 6}, { c: 7, d: { a: 8 } }) 
 
console.log(oldObj, newObj) 
 
function extend (obj) { 
  // делает глубокую копию чтобы убрать ссылки на объекты 
  return copy(Object.assign({}, obj, ...arguments)) 
} 
 
function copy (obj) { 
  return JSON.parse(JSON.stringify(obj)) 
}

В коде приставлен самый простой и быстрый вариант клонирования, но не совсем полноценно работает, подробней можете прочитать ЗДЕСЬ.

Я обычно использую этот npm пакет для этого.

READ ALSO
Сохранить позицию элемента

Сохранить позицию элемента

Подскажите пожалуйста, есть страница с перетаскиванием элемента

190
Google Api авторизация изнутри скрипта

Google Api авторизация изнутри скрипта

Как авторизоваться в google api изнутри javascript скрипта, введя почту и пароль? Сделать авторизацию через всплывающее окно авторизации гугла у меня...

184
Не переносится элемент

Не переносится элемент

Подскажите пожалуйста, есть страница на которой можно перенести <p> но нельзя перемещать <button>Подскажите пожалуйста, почему

195
java.io.IOException: Connection is closed

java.io.IOException: Connection is closed

При получении данных из БД довольно часто возникает такая ошибкаВ чем проблема? Использую среду NetBeans и GlassFish Server

176