返回对象文字显示nan

时间:2017-09-03 14:27:05

标签: javascript module

var myModule = (function(){
    var myObj = {
        fname:"Shashank",
        lname:"madan",  
        job:"Student",
        birthYear: 1999,
    }
    return {
        age:function(birthYear){
            return birthYear - 2017;
        },
        findJob:function(job){
            if(job == "Student"){
                console.log("Work Hard");
            }else{
                console.log("What do you do?");
            }
        },
        fullName: function(fname, lname){
            return this.fname + this.lname
        }   
    };
})();

问题是每当我尝试访问公开的返回元素时,我会得到奇怪的结果,因为myModule.age() NaNfindJob()"what do you do?"而不是"Work Hard" {1}}。

1 个答案:

答案 0 :(得分:0)

解决您的问题:

返回的所有三个函数至少包含一个参数。你还没有给他们提供返回结果所需的论据。这解释了NaN在调用age()"what do you do?"时调用findJob()(基本上job不等于“学生”,因为它是undefined )。

现在查看您的代码我非常确定您要在函数中使用myObj中包含的变量,这样如果您致电myModule.age(),您将获得18。所以这是代码:

var myModule = (function() {
  var myObj = {
    fname: "Shashank",
    lname: "madan",
    job: "Student",
    birthYear: 1999,
  }
  return {
    age: function(birthYear) {
      return 2017 - myObj.birthYear;
    },
    findJob: function(job) {
      if (myObj.job == "Student") {
        return "Work Hard";
      } else {
        return "What do you do?";
      }
    },
    fullName: function(fname, lname) {
      return myObj.fname + myObj.lname
    }
  };
})();

console.log(myModule.age())
console.log(myModule.findJob())

我给了你那些代码,这样你就可以看到你的错误了。如果您希望能够访问它的元素,则必须在返回的对象中访问myObj

使用类

但在我看来,这不是解决这个问题的最好方法。假设您想要两个对象而不是一个对象?你需要使用类。这样每个对象都有自己的fnamelnamejobfullName

let Module = function(fname, lname, job, birthYear) {

  // on instantiation we define the object's properties with the given arguments
  this.fname = fname;
  this.lname = lname;
  this.job = job;
  this.birthYear = birthYear;
    
  this.age = function() {
      return 2017 - this.birthYear; // <- we use `this` to access the object's property
  };
  
  this.findJob = function() {
    if (this.job === "Student") {
      return "Work Hard";
    } else {
      return "What do you do?";
    }
  };
  
  this.fullName = function() {
    return this.fname + this.lname
  };

};

let myModule = new Module("Shashank", "madan", "Student", 1999);
console.log(myModule.age())
console.log(myModule.findJob())

注意我如何调用我使用this的类中的属性。只要我在类的定义中,我就可以使用this来访问其他属性和方法(方法是类中的函数,但它们是相似的)。

但是,当我在外面时,我需要使用new语法实例化一个对象,如下所示:

let myModule = new Module("Shashank", "madan", "Student", 1999)

最后,您可以创建其他模块:例如

let anotherModule = new Module ("Winnie", "The Pooh", "Bee Hunter", 1926)

并且

anotherModule.fullName()

当然会返回"Winnie The Pooh"