javascript - 尝试编写一个显示和更改某些对象属性的 JS 脚本

标签 javascript object

所以我一直在学习 Javascript 的初学者类(class)。 我正在编写一个脚本来读取一个对象并以 HTML 格式显示它。

我还包含了一种根据出生日期 (DOB) 计算年龄的方法,因为我总是喜欢为挑战做一些额外的事情。

现在我设法做到了,这样我就可以更改 DOB,它也会在更改时显示,但年龄计算仍然显示从第一个 DOB 计算的年龄,然后我在网页上手动更改它。

我真的迷失在这一点上,面向对象编程对我来说非常困难,我花了一段时间才走到这一步。非常感谢一些反馈!

var person = new createPerson('Stijn', 'Lammers', "1994-06-05", 0);
var getDOB = document.getElementById("inputDag");
getDOB.addEventListener("keyup", enter);

document.getElementById('knop').onclick = function(){show(person)};

function enter(event){                         //function to change the DOB value.
if(event.keyCode === 13){
    var year = document.getElementById("inputJaar");
    var month = document.getElementById("inputMaand");
    var day = document.getElementById("inputDag");
    var yearValue = +year.value;
    var monthValue = +month.value;
    var dayValue = +day.value;
    if (yearValue > 2018 || monthValue > 12 || dayValue > 31){
        alert("Incorrect date");
    }else{
        person.DOB = yearValue + "-" + monthValue + "-" + dayValue; 
    }
  }
}

function createPerson(naam, achternaam, DOB, leeftijd){
    this.naam = naam;
    this.achternaam = achternaam;
    this.DOB = DOB;
    this.leeftijd = function(){               //method to calculate age.
        var today = new Date();
        var birthDate = new Date(DOB);
        var age = +today.getFullYear() - +birthDate.getFullYear();
        var m = today.getMonth() - birthDate.getMonth();
        if (m <0 || (m === 0 && today.getDate() < birthDate.getDate())){
            age = age -1;
        }
        return age;
    }
}


function show(p){
    document.getElementById('tekst').innerHTML = person.naam + " " + 
    person.achternaam + " " + person.DOB + " " + person.leeftijd();
}

HTML 主体:

<input type="text" id="inputJaar" size="1" maxlength="4" placeholder="YYYY">
<input type="text" id="inputMaand" size="1" maxlength="2" placeholder="MM">
<input type="text" id="inputDag" size="1" maxlength="2" placeholder="DD"><br>   
<button id='knop'>klik</button>
<p id='tekst'></p>

最佳答案

我认为您的问题与 leeftijd 定义中的这一行有关:

var birthDate = new Date(DOB);

在那里,您将 DOB 参数作为参数传递,而不是此人的 DOB (this.DOB)。

根据您的操作方式,我不太确定您应该如何操作。我相信这会奏效:

function createPerson(naam, achternaam, DOB, leeftijd){
  this.naam = naam;
  this.achternaam = achternaam;
  this.DOB = DOB;
  var self = this;
  this.leeftijd = function(){               //method to calculate age.
      var today = new Date();
      var birthDate = new Date(self.DOB); // here we take the DOB of the person. The 'self' stuff feels weird, I know, google about 'self = this' to know more
      var age = +today.getFullYear() - +birthDate.getFullYear();
      var m = today.getMonth() - birthDate.getMonth();
      if (m <0 || (m === 0 && today.getDate() < birthDate.getDate())){
          age = age -1;
      }
      return age;
  }
}

但是,现在不要这样做!。这不是您应该在 JavaScript 中执行 OOP 的方式。您正在为您创建的每个人创建一个 leftijd 函数。那很糟。所有的人实例都应该有相同的函数来计算他们的年龄。这是通过将函数添加到构造函数原型(prototype)来实现的。

现在,在 javaScript 中有几种方法可以做到这一点。老式的方法是在 Person 原型(prototype)中手动设置 leftijd 函数:

function Person(naam, achternaam, DOB, leeftijd){
  this.naam = naam;
  this.achternaam = achternaam;
  this.DOB = DOB;
}

Person.prototype.leftijd = function(){               //method to calculate age.
  var today = new Date();
  var birthDate = new Date(this.DOB);
  var age = +today.getFullYear() - +birthDate.getFullYear();
  var m = today.getMonth() - birthDate.getMonth();
  if (m <0 || (m === 0 && today.getDate() < birthDate.getDate())){
      age = age -1;
  }
  return age;
}

(请注意我是如何将 createPerson 重命名为 Person 的。构造函数在 javaScript 中通常是大写的。另外,使用 new 你知道你正在创建一个新人,所以创建感觉多余)

在上面的代码中,我将 leftijd 函数附加到 Person 的原型(prototype),这基本上意味着所有 Person 实例都将具有此函数。

相反,在您的原始代码中,创建的每个人都有自己的 leftijd 函数,这当然会分配更多内存。这是一个细微的差别,但您绝对不想在构造函数中向 this 添加函数。

现在,这个prototype 的东西感觉很奇怪,虽然知道它很好,但是有class 语法which is far simpler and straightforward :

class Person{
  constructor(naam, achternaam, DOB, leeftijd){
    this.naam = naam;
    this.achternaam = achternaam;
    this.DOB = DOB;
  }

  leftijd(){
    var today = new Date();
    var birthDate = new Date(this.DOB);
    var age = +today.getFullYear() - +birthDate.getFullYear();
    var m = today.getMonth() - birthDate.getMonth();
    if (m <0 || (m === 0 && today.getDate() < birthDate.getDate())){
        age = age -1;
    }
    return age;
  }
}

最后,两种方式的作用相同,但类语法隐藏了prototype 的怪异之处,并且类似于 Java 等更多其他语言。

祝你学习 javaScript 好运!

关于javascript - 尝试编写一个显示和更改某些对象属性的 JS 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53765675/

相关文章:

javascript - Angular2 显示错误 : TypeError: Cannot read property 'query' of null

javascript - 无法访问对象文字中的方法

c++ - 从 C++ 中的方法访问指向对象的私有(private)指针数组

c++ - 在代码中创建工具箱对象(例如标签等)

c# - 从列表中获取对象名称

javascript - 按下退格键或删除按钮时如何删除整个超链接?

javascript - 从 LightSwitch HTML 应用程序执行存储过程

javascript - 关联数组顺序不对

javascript - 这个例子中的 fn 是什么?

javascript - 更优雅的方式来获得过滤值(value)?