在 JavaScript 中创建模型 (POJO)

Jea*_*hel 7 javascript oop node.js

你能帮我解答疑惑吗?

我正在尝试一种在 JS 中更教化的方法,为模型类创建一个 POJO/POCO。

我有一个 Person 对象:

function person(name, age, gender) {
      this.name = name;
      this.age = age;
      this.gender = gender;
      return this;
}
Run Code Online (Sandbox Code Playgroud)

现在我可以创建一些数据:

var personalities = new Array(new person("Alicia", 152, "F"), 
                              new person("Bartolomeu Simpson", 36, "M"),
                              new person("Ayrton Senna", 58, "M"),
                              new person("Jean J. Michel", 36, "M"),
                              new person("Jean J. Michel", 37, "M"));
Run Code Online (Sandbox Code Playgroud)

好吧,如果我调用 sort 方法就完成了,没有操作来排序这些数据:

personalities.sort();

for(var i = 0; i < personalities.length; i++)
  console.log(personalities[i].name);
Run Code Online (Sandbox Code Playgroud)

输出是:

Alicia
Bartolomeu Simpson
Ayrton Senna
Jean J. Michel
Jean J. Michel
Run Code Online (Sandbox Code Playgroud)

我创建了一个 toString() 方法:

function person(name, age, gender) {
  this.name = name;
  this.age = age;
  this.gender = gender;

  this.toString = function() {
    return this.name + " " + 
           this.age + " years old" + 
           (this.gender == 'M' ? " man" : " woman");
  };

  return this;
}
Run Code Online (Sandbox Code Playgroud)

现在排序方法“ok”了,现在的输出是:

Alicia
Ayrton Senna
Bartolomeu Simpson
Jean J. Michel
Jean J. Michel
Run Code Online (Sandbox Code Playgroud)

但我想做一些不同的事情,按姓名和年龄排序(最老的在前)。我实现了方法 compareTo(obj):

function person(name, age, gender) {
  this.name = name;
  this.age = age;
  this.gender = gender;

  this.toString = function() {
    return this.name + " " + 
           this.age + " years old" + 
           (this.gender == 'M' ? " man" : " woman");
  };

  this.compareTo = function(otherPerson) {
    var resultOfComparison = 0;

    if(this.name > otherPerson.name) {
      resultOfComparison = 1;
      return resultOfComparison;
    }
    else if(this.name < otherPerson.name) {
      resultOfComparison = -1;
      return resultOfComparison;
    }
    else if(this.age > otherPerson.age) {
      resultOfComparison = -1;
      return resultOfComparison;
    }
    else if(this.age < otherPerson.age) {
      resultOfComparison = 1;
      return resultOfComparison;
    }

    return resultOfComparison;
  };

  return this;
}
Run Code Online (Sandbox Code Playgroud)

方法还行,看看吧:

var jean1 = new person("Jean J. Michel", 36, "M");
var jean2 = new person("Jean J. Michel", 37, "M");

console.log(jean1.compareTo(jean2)); //1
console.log(jean1.compareTo(jean1)); //0
console.log(jean2.compareTo(jean1)); //-1
Run Code Online (Sandbox Code Playgroud)

我可以使用这种方法对我的数组进行排序吗?像这样的东西:

personalities.sort(person.compareTo);
Run Code Online (Sandbox Code Playgroud)

我真的不想在使用我的模型的服务类中这样做:

personalities.sort(function(personA, personB) {
                     var resultOfComparison = 0;

                     if(personA.name > personB.name) {
                       resultOfComparison = 1;
                       return resultOfComparison;
                     }
                     else if(personA.name < personB.name) {
                       resultOfComparison = -1;
                       return resultOfComparison;
                     }
                     else if(personA.age > personB.age) {
                       resultOfComparison = -1;
                       return resultOfComparison;
                     }
                     else if(personA.age < personB.age) {
                       resultOfComparison = 1;
                       return resultOfComparison;
                     }

                     return resultOfComparison;
                   });
Run Code Online (Sandbox Code Playgroud)

我认为这是模范责任。

感谢所有帮助。

Mát*_*nka 6

好吧,您传递给的比较器函数sort()需要带两个参数,因此它不能是实例方法。我建议您将其定义为“静态”方法:

function person(name, age, gender) {
    this.name = name;
    this.age = age;
    this.gender = gender;
}

person.compare = function(personA, personB) {
    if(personA.name > personB.name) return 1;
    if(personA.name < personB.name) return -1;
    return personB.age - personA.age;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以在排序时调用它:

personalities.sort(person.compare);
Run Code Online (Sandbox Code Playgroud)

我希望我能正确理解你在问什么。