2013-12-26 3 views
3

Я изучаю код, и я увидел практику внедрения одной функции конструкторы в другое использовало много раз:конструктор внутри конструктора - плохая практика?

/** 
* @constructor 
*/ 
function contact_duplicates_manager(global_objects) 
{ 
    this.field_processors = 
    { 
     "Phone1Number": new phone_processor(), 
     "Phone2Number": new phone_processor(), 
     "Phone3Number": new phone_processor() 
    } 
    //...here some other code 

    /** 
    * @constructor 
    */ 
    function phone_processor() 
    { 
     //...here some other code 

     function clear_phone(phone) 
     { 
      //...here some code 
     } 
     this.is_equals = function (value1, value2) 
     { 
      return is_equals(clear_phone(value1), clear_phone(value2)); 
     } 
    } 
} 

//... later in the code 
var valid = this.field_processors[fld_name]["is_equals"](native_value, custom_value) 

Как вы думаете phone_processor функция конструктора должна быть вне contact_duplicates_manager?

+0

Сначала я бы написал его в читаемом формате (стиль Java). – spectre

+0

Как используется 'phone_processor()'? – nnnnnn

+0

Это просто «функция» внутри 'function', и с ней ничего не случилось *. Инкапсулирующий код, который используется только в родительской функции, на мой взгляд является хорошей практикой. – mekwall

ответ

2

Как вы думаете, phone_processor Функция конструктора должна быть за пределами contact_duplicates_manager?

Да. Несмотря на то, что он действителен и работает, он неэффективен и, возможно, не читается. При вложенности каждый экземпляр contact_duplicates_manager имеет phone_processor с различными конструкторами и наследует от другого объекта-прототипа. Это может потребоваться для фабрик-конструкторов или аналогичных шаблонов, но это очень редко, и я сомневаюсь, что вам это нужно здесь.

Мои Эмпирические правила:

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

Пример последнего правило:

function Item(…) {…} 
function Store { 
    var that = this; 
    this.items = []; 
    this.addItem = function(…) { 
     that.items.push(new LocalItem(…)); 
    }; 
    function LocalItem(…) { 
     Item.call(this, …); 
     this.store = that; 
    } 
    LocalItem.prototype = Item.prototype; 
} 

Вам не обязательно глобальный Item функции, которую вы называете наследованием, как, иногда один глобальным proto объекта, который можно назначить LocalConstructor.prototype достаточно.

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