父类在Node JS中的静态方法中使用子类吗?

时间:2016-02-22 17:59:09

标签: 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;

Parent的静态方法取决于知道男性和女性的课程。我不能在Person.js的顶部做require('./Male.js');,因为男性依赖于人。

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

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

2 个答案:

答案 0 :(得分: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 :(得分:0)

如果我理解正确,makePersonBySettings()是一个允许用户创建Male Female实例而无法直接访问这些类的函数。我想你想把男性,女性和个人分开存放。这在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;

在单独的文件中,需要您的Male,Female和Person文件,现在添加静态方法,如下所示:

// 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提到的工厂模式,除非出于某种原因完全不在桌面上。