2014-09-21 2 views
1

Im привязка для создания простого объекта, подобного jQuery, но я просто не могу понять, как переопределить функцию внутри объекта.Javascript redefine private function

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

<!DOCTYPE html> 
<html> 
<head lang="en"> 
    <meta charset="UTF-8"> 
    <title></title> 
    <script> 
     (function($) { 
      var hasError = 0; 

      var errorHandler = function(msg) { 
       hasError = 1; 
       console.log('Before: ' + msg); 
      }; 

      var callback = { 
       success: function(data) { }, 
       failure: function(msg) { } 
      }; 

      $.init = function() { 
       try { 
        something_bad; 
       } 
       catch(e) { 
        errorHandler(e.toString()); 
       } 
       callback.success(1); 
      }; 

      $.override = function(methodName, method) { 
       // How do i redefine the method?? 
       methodName = method; 
      }; 

     }(window.ZOO = window.ZOO || {})); 
    </script> 
</head> 

<body> 
<script> 
    ZOO.override('errorHandler', function(msg) { 
     hasError = 1; 
     console.log('After: ' + msg); 
    }); 

    ZOO.override('callback.success', function(data) { 
     console.log(data); 
    }); 

    ZOO.init(); 
</script> 
</body> 
</html> 
+0

Почему бы просто не сделать его общедоступным методом '$ .errorHandler', если вы хотите, чтобы он был перезаписываемым? Нет необходимости использовать прототипы, просто свойства. – Bergi

+0

@Bergi Потому что тогда он не получит доступ к частным свойствам и методам, поэтому мне придется сделать их общедоступными, но я не хочу, чтобы некоторые свойства или методы были доступны публично. – Christian

+0

Нет, у исходной функции все равно будет доступ к ним. – Bergi

ответ

3

Частная функция имеет this контекст как window. Там, кажется, некоторая внутренняя переменная функция создана, и мы можем использовать имя функции в качестве переменной:

$.override = function(methodName, method) { 
    errorHandler = method; 
}; 

По предложению TJCrowder, вы должны определить функцию переменную так:

var errorHandler = function(msg) { ... } 

Обновление: Чтобы сделать его динамичным, вы можете использовать eval() функцию:

$.override = function(methodName, method) { 
    eval(methodName + " = method"); 
}; 
+1

Совершенно так. В общем, я рекомендую изменить первоначальное создание функции на 'var errorHandler = function ...', если вы собираетесь перезаписать значение позже, но нет * требования * к. –

+0

, но это не позволяет динамическое переназначение. Что, если у меня есть другой метод, который я хотел бы переопределить? – Christian

+0

@Christian не уверен, что вы имели в виду, с помощью этого метода вы всегда вызываете '$ .override' для переопределения, тогда назначение меняет ваш' errorHandler'. Это все. –

0

я бы выбрал р rotoryping: Проверить this fiddle is for you!

Реализация:

function ZOOd(){ 
    this.hasError= 0; 
} 

ZOOd.prototype.errorHandler = function(msg){ 
    this.hasError = 1; 
    console.log('Before: ' + msg); 
} 

ZOOd.prototype.init =function(){ 
    try { 
     /*something_bad;*/ 
    } 
    catch(e) { 
     this.errorHandler(e.toString()); 
    } 
} 



ZOO.prototype = new ZOOd();  // Here's where the inheritance occurs 
ZOO.prototype.constructor=ZOO;  // Otherwise instances of ZOO would have a constructor of ZOO 

function ZOO(){ 
    this.hasError= 0; 
} 
ZOO.prototype.errorHandler = function(msg){ 
    this.hasError = 1; 
    console.log('After: ' + msg); 
} 

var zoo = new ZOO(); 
zoo.init(); 

Я надеюсь, что это помогает!

+0

Это кажется немного более сложным для среднего Джо для реализации. Я пишу модуль для всех, даже тех, у кого нет навыков кодирования, пытающихся реализовать наш продукт. 'ZOO.override ('errorHandler', function (msg) {console.log ('После:' + msg);});' Большинство людей знают, что означает 'override', особенно если они смотрели фильм злодея, поэтому он кажется более значимым. – Christian

+1

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

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