2016-02-22 45 views
3

比方说,我有两个子类:在Node JS中的静态方法中有父类使用子类吗?

Male.js

var Person = require('./Person.js'); 

class Male extends Person { 
    ... 
} 

module.exports = Male; 

Female.js

var Person = require('./Person.js'); 

class Female extends Person { 
    ... 
} 

module.exports = Female; 

最后,我有这个基类:

Person.js

class Person { 

    static makePersonBySettings(settings) { 
     var person; 

     if(settings.gender == 'male') { 
      person = new Male(settings.name); 
     } 
     else if(settings.gender == 'female') { 
      person = new Female(settings.name); 
     } 

     return person; 
    } 

} 

module.exports = Person; 

家长的静态方法取决于知道男性和女性的类是什么。我不能在Person.js顶部做require('./Male.js');,因为男性依赖于Person。

Objective-C,Java等允许您在编译器解决问题时执行此操作。

使用Node JS解决此问题的最佳方法是什么?

回答

3

这也可能是最好使用Factory pattern,就像这样:

function Maternity{ 
    this.giveBirthTo = function(settings){ 
     var person; 
     if(settings.gender == 'male') { 
      person = new Male(settings.name); 
     } 
     else if(settings.gender == 'female') { 
      person = new Female(settings.name); 
     } 

     return person; 
    } 
} 

然后,后来在代码:

var factory = new Maternity(); 
var john = factory.giveBirthTo({name: 'John', gender:'male'}); 
+1

我喜欢这一点,最好在基类上有比工厂方法更好的工厂方法 – vittore

0

如果我理解正确,makePersonBySettings()是一种功能,允许用户创建MaleFemale实例无法直接访问这些类。我想你想要男性,女性和人在不同的文件。这在Node中有点不寻常。但是,如果您想要遵循此模式,您可以执行此操作:

定义您的Person类,但现在忽略makePersonBySettings()

// person-base.js 
'use strict'; 

class Person { ... } 

module.exports = Person; 

定义你的男性和女性的类;要求每个人的顶部。

// female.js 
'use strict'; 

var Person = require('./person-base'); 

class Female extends Person { ... } 

module.exports = Female; 

在一个单独的文件,需要你的男,女,和人的文件,现在添加您的静态方法,像这样:

// person.js 
'use strict'; 

var Person = require('./person-base'); 
var Male = require('./male'); 
var Female = require('./female'); 

Person.makePersonBySettings = function() { 
    // You can reference Male and Female here. 
}; 

module.exports = Person; 

现在你可以require('./person.js')当您需要它。

尽管如此,我认为您应该考虑@TudorConstantin提到的工厂模式,除非由于某些原因完全不在表格中。

+0

您可以在没有额外类的情况下执行此操作:var person = module.exports = class {}'; –

相关问题