【问题标题】:Create a model (POJO) in JavaScript在 JavaScript 中创建模型 (POJO)
【发布时间】:2018-09-12 18:56:11
【问题描述】:

你能帮我解决一个问题吗?

我正在尝试一种在 JS 中更具指导性的方法,为模型类创建 POJO/POCO。

我有一个 Person 对象:

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

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

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"));

好吧,如果我调用 sort 方法就可以了,没有任何动作来排序这些数据:

personalities.sort();

for(var i = 0; i < personalities.length; i++)
  console.log(personalities[i].name);

输出是:

Alicia
Bartolomeu Simpson
Ayrton Senna
Jean J. Michel
Jean J. Michel

我创建了一个 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;
}

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

Alicia
Ayrton Senna
Bartolomeu Simpson
Jean J. Michel
Jean J. Michel

但我想做一些不同的事情,按姓名和年龄排序(从大到小)。我实现了方法 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;
}

方法还可以,看看吧:

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

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

personalities.sort(person.compareTo);

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

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;
                   });

我认为这是一种模范责任。

感谢大家的帮助。

【问题讨论】:

  • 为什么不传递.sort() 一个只返回personA.compareTo(personB) 的小函数?
  • 怎么做?你能给我指路吗?
  • personalities.sort((personA, personB) =&gt; personA.compareTo(personB));

标签: javascript node.js oop


【解决方案1】:

嗯,你传递给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;
}

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

personalities.sort(person.compare);

希望我能正确理解您的问题。

【讨论】:

  • 想象一个 .js 文件 servicePerson。我称之为按姓名列出人员。该服务调用 personDAO 并进入 DB 并使用 personModel.js 类型的对象填充一个数组(我的函数 person 在哪里)。如果我想在服务层订购 de 数组,我是否调用了 people.sort()?真难闻!这个逻辑必须在模型层并且对所有 DAO、服务、控制器等都是通用的。
  • 不,这就是我写的重点。您绝对不应该将排序逻辑作为匿名函数传递给sort()。相反,在某处定义它,例如作为模型类的静态成员函数,并将该函数传递给sort()
  • 对不起,现在我写了代码并理解了你的意思。但我不明白为什么会这样 :) person.compareTo = function ... 为什么要在我的对象上添加一个函数?我现在可以重构我的 person 函数并将 toString 更改为 person.toString = function... ;)
  • person.compareTo 是您的人员类的“静态方法”。严格来说,它是你的person() 函数的一个方法。这意味着您不会通过personinstances 调用它,例如personA.compareTo(如果你尝试这样做,你实际上会得到一个错误)。相反,它是类本身的方法。整个主题更深入,我建议阅读 JavaScript 中的 OOP 以获得更清晰的画面。 MDN 有不错的资料:developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects
【解决方案2】:

非常感谢所有回复。 Máté 为我提供了一个我在 JS 中并不真正了解的主题的路径。

我的最后一堂课是:

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;
}

而我的 compareTo 方法现在是静态的:

person.compareTo = 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;
                   };

所有这些代码都在 PersonModel.js 中。

现在在我的服务/DAO 中,我可以这样做:

var personalities = new Array(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"),
                              new person("Alicia", 152, "F"));

personalities.sort(person.compareTo);

结果将是:

Alicia 152 years old woman
Ayrton Senna 58 years old man
Bartolomeu Simpson 36 years old man
Jean J. Michel 37 years old man
Jean J. Michel 36 years old man

干得好,结案:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 2015-01-18
    • 1970-01-01
    相关资源
    最近更新 更多