在Node.js中表示状态的常用模式是什么

时间:2012-05-20 06:18:26

标签: javascript node.js functional-programming

例如在经典的面向对象编程中,我可能有一个类School,它有一个String数组代表学生(不是理想的数据结构,但仅用于说明目的)。它可能看起来像这样

class School {
    String name;
    String[] students;
}

然后,我可以实例化一堆不同的学校,每个学校都有不同的名字和不同的学生。这个概念如何转化为Node.js?如果我有一个School模块,那么在整个应用程序中共享一个实例。我最初的想法是将每个学校表示为JSON对象,并且基本上传递JSON,我通常会在学校的一个实例中传递。这是正确的想法吗?有其他方法吗?

3 个答案:

答案 0 :(得分:3)

如果状态应该从外部隐藏(即受保护的属性),您可以执行以下操作:

SchoolFactory = {
    create: function(name, students) {
        students = students || [];
        // return the accessor methods
        return {
            getName: function() {
                return name;
            },
            addStudent: function(student) {
                students.push(student);
            }
            // add more methods if you need to
        }
    }
}

var school = SchoolFactory.create('Hogwarts');
console.log(school); // will not display the name or students
school.addStudent('Harry');

答案 1 :(得分:2)

构造函数和实例:

function School(name, students) {
  this.name = name;
  this.students = students || [];
};
School.prototype.enroll = function (student) {
  if (!~this.students.indexOf(student)) {
    this.students.push(student);
  } else {
    throw new Error("Student '" + student + "' already enrolled in " + this.name);
  }
};
var s = new School("Lakewood");
console.log(s.name);
console.log(s.students);
s.enroll("Me");
console.log(s.students);

答案 2 :(得分:0)

我不关心任何模式......但是如果你喜欢这些模块......你可以申报一个学校模块并在其中导出一个学校课程。单个实例将不会被共享,因为您将实例化类