2016-05-05 2 views
2

У меня есть JavaScript Object, как показано ниже:Override внутренней функции функции прототипа в JavaScript

var Loader = function() {} 
Loader.prototype = { 
    constructor: Loader, 
    foo: function(a, b) { 
     function bar() { 
      return a + b; 
     } 
     return bar(); 
    } 
}; 

мне нужно переопределить бар() функция присутствует внутри Foo. Функция Foo может быть переопределена как:

Loader.prototype.foo = function() {} 

Я попробовал то же самое для внутренней функции, но не повезло.

Loader.prototype.foo.bar = function() {}//doesnt work 
Loader.prototype.foo.protoype.bar = function() {}//doesnt work 

Я был бы очень рад, если бы кто-то мог указать мне в правильном направлении. Заранее спасибо

+1

Вы не можете переопределить внутреннюю функцию, потому что это сфера ограничивается функция foo. –

+0

Думаю, вам придется переопределить (скопировать пасту) всю функцию foo() и изменить только соответствующие части. Да, это может быть плохо, если обновления поступят за то, что вы переопределяете (возможно, сторонняя библиотека). – Thernys

ответ

3

В текущей декларации функция bar() не может быть изменена. Он существует в области foo() и не может быть изменен извне.


Альтернативное решение для динамического переопределения может быть:

var Loader = function() {} 
Loader.prototype = { 
    constructor: Loader, 
    foo: function(a, b, barFun) { 
     if (typeof barFun !== 'function') { 
      barFun = function() { 
       return a + b; 
      } 
     } 
     return barFun.call(this, a, b); 
    } 
}; 

При вызове foo(), можно использовать пользовательскую функцию в качестве 3-го параметра.
Затем вы можете использовать:

var loader1 = new Loader(); 

loader1.foo(1, 2); // prints 1 + 2 = 3, default bar() function 

loader1.foo(1, 2, function(a, b) { 
    return a - b; 
}); // prints 1 - 2 = -1, custom bar() function 

Проверьте working demo.

+0

Спасибо за быстрый ответ, похоже, мне придется пойти с этим подходом. – Sandeep

+0

Но 'bar' можно эффективно заменить, просто назначив другую функцию' foo', которая использует другой код, чем то, что делает 'bar', и это можно сделать извне. – jfriend00

+1

@ jfriend00, что означает, что если у меня есть 60 различных функций внутри foo(), мне придется переопределить их все. – Sandeep

0

На мой взгляд, функция внутренней бар не метод функции Outter Foo, который является метод загрузчика object.Hope, что это поможет вам

+0

Нет, это не помогает. bar() является функцией foo(), которая является функцией Loader. – Sandeep

+0

Я просто имел в виду, что это не метод этого. – laoqiren