Метод Extend для примесей.Не понятен фрагмент с “примешиванием” замыканий вызывающие методы примесей

165
05 апреля 2019, 04:00

Не пойму кусок кода из статьи про примеси(mixin),там где "примешивают" замыкания. Конкретно в строках 1 и 2 не понятно что происходит?Ссылка на статью https://habr.com/post/132340/

function extend_2(object) 
{ 
    var mixins = Array.prototype.slice.call(arguments, 1); 
    for (var i = 0; i < mixins.length; ++i) 
    { 
        for (var prop in mixins[i]) 
        { 
            if (typeof object.prototype[prop] === "undefined") 
            { 
                bindMethod = function (mixin, prop) //(1) 
                { 
                    return function () { mixin[prop].apply(this, arguments) } 
                } 
 
                object.prototype[prop] = bindMethod(mixins[i], prop);//(2) 
            } 
        } 
    } 
}

Answer 1

В указанных строках

bindMethod = function (mixin, prop) //(1)
{
    return function () { mixin[prop].apply(this, arguments) }
}
object.prototype[prop] = bindMethod(mixins[i], prop);//(2)

Происходит следующее:

  1. создается функция, которая

    1. принимает два параметра
    2. возвращает новую функцию
    3. в возвращаемой функции вызывается метод, которому устанавливается текущий this и arguments.
  2. вызывается созданная функция, и результат записывается в переменную.

Если не обращать внимания, что bindMethod утекает в глобальную область видимости, можно сказать, что эта функция вообще не нужна, так как кроме создания еще одной функции ничего не делает.

Поэтому указанный код можно заменить на следующий:

object.prototype[prop] = mixins[i][prop];

Если прочитать исходную статью можно отметить, что данная функция была введена для того, чтобы была возможность подменить саму функцию mixin, после того, как она уже была куда-то примешена.

Пример:

function extend_2(construct, ...mixins) { 
  mixins.forEach(mixin => { 
    for (var prop in mixin) { 
      if (typeof construct.prototype[prop] === "undefined") { 
        var bindMethod = function(mixin, prop) //(1) 
        { 
          return function() { 
            mixin[prop].apply(this, arguments) 
          } 
        } 
 
        construct.prototype[prop] = bindMethod(mixin, prop); //(2) 
      } 
    } 
 
  }); 
} 
 
var mixins = { 
  say: function() { 
    console.log('base say') 
  } 
} 
 
function A() {} 
 
extend_2(A, mixins); 
 
var a = new A(); 
 
a.say(); 
 
mixins.say = function() { 
  console.log('new say') 
} 
 
a.say();

READ ALSO
Вызов метода Nuxt из экземпляра класса

Вызов метода Nuxt из экземпляра класса

Сделал отдельным файлом конструктор класса с методами, его импортирую в компонент VueКак можно вызвать метод компонента Vue из класса, созданного...

139
использовать axios

использовать axios

Не работает axios пишет ошибку Cannot read property 'post' of undefined вот пример кода

213
Выполнить функцию если у блока будет класс

Выполнить функцию если у блока будет класс

Нужно выполнить данную функцию если у блока ("cart") будет класс ("cart-active")

149
Всплытие блока там где произошел click

Всплытие блока там где произошел click

Есть скрытый блок iframe, который находится в bodyНа сайте есть проекты, у которых есть ссылка перехода на карточку проекта

123