Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中使用解耦的模块/对象_Javascript_Module_Decoupling - Fatal编程技术网

在JavaScript中使用解耦的模块/对象

在JavaScript中使用解耦的模块/对象,javascript,module,decoupling,Javascript,Module,Decoupling,我对JS中面向对象编程和模块化项目结构的理解是,尽可能地解耦对象/模块是最佳实践。例如,假设我有以下两个解耦模块: // person.js module.exports = function() { this.firstName: ''; this.lastName: ''; }; // occasion.js module.exports = function() { this.title: ''; this.date: ''; }; 当这些模块实例化时,

我对JS中面向对象编程和模块化项目结构的理解是,尽可能地解耦对象/模块是最佳实践。例如,假设我有以下两个解耦模块:

// person.js
module.exports = function() {
    this.firstName: '';
    this.lastName: '';
};

// occasion.js
module.exports = function() {
    this.title: '';
    this.date: '';
};
当这些模块实例化时,对象将保存该类型的相关数据。但是,假设我有另一个模块使用两种类型的数据:

// invitation.js
module.exports = function() {
    this.eventTitle: '';
    this.eventDate: '';
    this.sendTo: '';
}
此模块的实例需要从
场合
对象获取
标题
日期
,还需要从
个人
对象获取并连接
名字
姓氏

显然,为了能够从两种特定的对象类型中获取信息,并将它们组合成另一种类型,我必须有一个功能或一些高度耦合的东西,即理解所有相关模块的结构的东西

考虑到面向对象编程和调制代码管理方法的最佳实践,这些转换器、缝合器、控制器(无论您如何称呼它们)应该如何在项目中实现

1) 我是否为每个可能的交互创建一个模块,该交互使用单个内置方法导出对象?e、 g

//person-and-occasion-to-invitation.js
module.exports = function() {
    this.getInvitation = function(person, occasion) {
        var invitation = new Invitation();
        invitation.eventTitle = occasion.title;
        invitation.eventDate = occasion.date;
        invitation.sendTo = person.firstName + ' ' + person.lastName;
        return invitation;
    };
};
//person-and-occasion-to-invitation.js
module.exports = function(person, occasion) {
    var invitation = new Invitation();
    invitation.eventTitle = occasion.title;
    invitation.eventDate = occasion.date;
    invitation.sendTo = person.firstName + ' ' + person.lastName;
    return invitation;
};
仅仅为了执行一项任务而实例化一个对象似乎很愚蠢,而我的模块文件夹很快就会被填满

2) 我是否为导出单个方法的每个可能的交互创建一个模块?e、 g

//person-and-occasion-to-invitation.js
module.exports = function() {
    this.getInvitation = function(person, occasion) {
        var invitation = new Invitation();
        invitation.eventTitle = occasion.title;
        invitation.eventDate = occasion.date;
        invitation.sendTo = person.firstName + ' ' + person.lastName;
        return invitation;
    };
};
//person-and-occasion-to-invitation.js
module.exports = function(person, occasion) {
    var invitation = new Invitation();
    invitation.eventTitle = occasion.title;
    invitation.eventDate = occasion.date;
    invitation.sendTo = person.firstName + ' ' + person.lastName;
    return invitation;
};
再一次,我的模块文件夹会很快被填满,而且在OOP中,不是所有的东西都应该包含在一个对象中吗

3) 我是否创建了一个包含所有可能交互的模块?e、 g

//interactions.js
module.exports = function() {
    this.personAndOccasionToInvitation = function(person, occasion) {
        var invitation = new Invitation();
        invitation.eventTitle = occasion.title;
        invitation.eventDate = occasion.date;
        invitation.sendTo = person.firstName + ' ' + person.lastName;
        return invitation;
    };
};
这将使我的模块文件夹更干净,但它可能会变得很长,我觉得它正在创建一个上帝对象

处理解耦模块时的最佳/常用做法是什么?有人能解释一下方法并提供一些例子吗?

“在OOP中,不是所有的东西都应该包含在一个对象中吗?”-没有。您正在编写JavaScript,一种函数式语言,而不是Java。