2015-02-20 3 views
1

Как повторно использовать одну и ту же конструкторскую функцию в нескольких объектах?duplicate constructor function

Здесь creditor_group построен в обоих объектах .. Как дублировать функцию Delegate !?

http://jsfiddle.net/q2nxuhyc/2/

код

var App = {}; 
App.module_group = function(main, location, table){ 
    this.init = function(){ 
     console.log('init: '+table+' args: '+main+', '+location); 
    }; 

    this.test = function(){ 
     console.log('test: '+table); 
    }; 
}; 

function Delegate(main, location){ 
    this.table; 
    this.module_name; 

    var module; 

    this.init = function(){ 
     module = new App[this.module_name](main, location, this.table); 
     module.init(); 

     return module; 
    }; 

    this.test = function(){ 
     module.test(); 
    }; 
} 

var module_1 = Delegate; 
module_1.prototype.table = 'debtor_group'; 
module_1.prototype.module_name = 'module_group'; 

var module_2 = Delegate; 
module_2.prototype.table = 'creditor_group'; 
module_2.prototype.module_name = 'module_group'; 

// This part where the objects are constructed is done in another scope 
var m_1 = new module_1('main', 'location'); 
m_1.init(); 
m_1.test(); 
var m_2 = new module_2('main', 'location'); 
m_2.init(); 
m_2.test(); 

консоль

init: creditor_group args: main, location 
test: creditor_group 
init: creditor_group args: main, location 
test: creditor_group 
+1

Консольный выход происходит потому, что «module_1.prototype» и «module_2.prototype» относятся к одному и тому же объекту, поэтому вы перезаписываете свойство таблицы. – CrowbarKZ

+0

Я знаю .. Но как его решить ?! – clarkk

+0

Мне немного непонятно, что вы хотите там сделать. Если вы хотите создать разные объекты с одним и тем же конструктором, вы можете передать все значения (например, table, module_name) в качестве параметров. Или вы можете создавать новые конструкторы, которые наследуют от Delegate и изменят их прототипы. – CrowbarKZ

ответ

2

Похоже, вы хотите использовать наследование с двумя дополнительными конструкторами module_1 и module_2, что и назвать Delegate:

function Delegate(main, location) { 
    this.module = null; 
    this.init = function() { // you should do initialisation stuff directly in the 
          // constructor, not an `init` method 
     this.module = new App[this.module_name](main, location, this.table); 
     this.module.init(); 
    }; 
} 
Delegate.prototype.test = function(){ 
    this.module.test(); 
}; 

function Module_1(main, location) { 
    Delegate.call(this, main, location); 
} 
Module_1.prototype = Object.create(Delegate.prototype); 
Module_1.prototype.table = 'debtor_group'; 
Module_1.prototype.module_name = 'module_group'; 


function Module_2(main, location) { 
    Delegate.call(this, main, location); 
} 
Module_2.prototype = Object.create(Delegate.prototype); 
Module_2.prototype.table = 'creditor_group'; 
Module_2.prototype.module_name = 'module_group'; 
+0

Ваши решения - это то, что я искал. Но что делает эта линия? Я могу избежать строки, и код все еще работает 'Module_1.prototype = Object.create (Delegate.prototype);' – clarkk