2016-02-03 5 views
0

Я использую внешнюю библиотеку JavaScript, которая должна оставаться неизменной. Мне нужна функциональность, которая будет запускаться всякий раз, когда определенная функция была вызвана/завершена.Перезаписать вложенную функцию или приложить новую функциональность

Раньше я бы переопределил эту функцию и добавил мой код до конца. Однако последняя версия этой внешней библиотеки имеет функцию, вложенную в функционал.

Есть ли способ, с помощью которого я могу переопределить/прикрепить новую функциональность к сторонней функции?

function View() {} 

window.View = View; 

View.FunctionINeedToChange = View_FunctionINeedToChange; 
function View_FunctionINeedToChange(a) { 
    // Code 
    } 
} 
// I need my code to execute here 

«View_FunctionINeedToChange» вызывается внутри в сценарии 3 партии, однако единственное, что я могу переопределить это «View.FunctionINeedToChange», так что мои изменения не делают никакой разницы.

+0

Любой образец кода? – Rayon

+0

Как называется эта функция? – nnnnnn

+0

* «Я могу переопределить« View.FunctionINeedToChange »*. Итак, в чем проблема, если вы * можете * сделать это, это именно то, что вам нужно. – dfsq

ответ

0

Как только вы определили прототип объекта, вы можете добавить функции в экземпляр с помощью Object.defineProperty.

view = new View() 
Object.defineProperty(view, 'FunctionINeedToChange', { 
    value: function (input, param, etc) { 
     // your code here 
    } 
}); 

Или, вы можете прикрепить функцию к прототипу View.

View.prototype.FunctionINeedToChange = function (input, param, etc) { 
    // your code here 
}; 

Разница в том, первый пример будет изменить только один экземпляр из view использовать функциональные возможности, в то время как второй пример изменит всех экземпляров, созданных (даже те, которые были созданы в прошлом!).

Однако все это ничего не значит, если ваш сторонний код выполняет свой собственный код перед тем, как увидеть изменения, добавленные вами в View, или если он использует лексически определенное определение (что, вероятно, так).

Я думаю, что вам лучше не пытаться изменить сторонний код, обезьяна патчирует свои внутренние определения объектов, но вместо этого полагалась на создание собственных экземпляров и изменение их для ваших собственных потребностей.

0

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

Смежные вопросы