2012-08-26 21 views
0

我正在致力于在Codecademy的JavaScript课程。在本练习中,我们应该创建函数add,该函数应该将人员添加到contacts阵列,然后使用提示从用户获取信息,之后我们调用函数list以打印contacts中的所有人员阵列到控制台。为什么这个函数打印“undefined undefined”作为联系人名称,添加了“new Object”?

当我运行下面的代码时,它列出contacts阵列中的两个现有人员,但随后打印"undefined undefined"给我尝试添加提示的人员。但是,当我打印contacts的长度时,它说3,因此添加了一个人。

任何帮助将不胜感激。

var bob = { 
 
    firstName: "Bob", 
 
    lastName: "Jones", 
 

 
    phoneNumber: "(650) 777 - 7777", 
 
    email: "[email protected]" 
 
}; 
 

 
var mary = { 
 
    firstName: "Mary", 
 
    lastName: "Johnson", 
 

 
    phoneNumber: "(650) 888 - 8888", 
 
    email: "[email protected]" 
 
}; 
 

 
var contacts = new Array(bob, mary); 
 

 
function printPerson(person) { 
 
    console.log(person.firstName + " " + person.lastName); 
 
} 
 

 
function list() { 
 
    var length = contacts.length; 
 
    var i; 
 
    for (i = 0; i < length; i++) { 
 
    printPerson(contacts[i]); 
 
    } 
 
} 
 

 
/*Create a search function 
 
then call it passing "Jones"*/ 
 

 
var search = function(lastName) { 
 
    var number = contacts.length; 
 
    for (i = 0; i < number; i++) { 
 
    if (contacts[i].lastName === lastName) { 
 
     printPerson(contacts[i]); 
 
    } 
 
    } 
 
}; 
 

 
var add = function(firstName, lastName, email, telephone) { 
 
    contacts[contacts.length] = new Object(firstName, lastName, email, telephone); 
 
}; 
 

 
var firstName = prompt("What is your first name"); 
 
var lastName = prompt("What is your last name"); 
 
var email = prompt("What is your email"); 
 
var telephone = prompt("What is your phone number"); 
 
add(firstName, lastName, email, telephone); 
 
list();

+2

的对象,评估的结果'person'是你期待什么不和它没有名为'firstName'或'lastName'的属性:'new Object(firstName,lastName,email,telephone)'< - 这不是你想要的。尝试使用对象文字,而不是在代码的开头使用。 – 2012-08-26 22:48:38

+0

不要忘记声明变量(* i * in * search *)。也不是功能表达式的功能声明(* search *和* add *函数)的粉丝。最后,使用数组文本而不是数组构造函数,例如而不是'var contacts = new Array(bob,mary);'使用'var contacts = [bob,mary];'。 – RobG

回答

3

要创建具有属性的新对象,你必须给它为每个属性都属性名称和属性值。您只是将值列表传递给new Object()构造函数,该构造函数不会生成所需的对象类型。

有几种方法可以用属性创建一个新对象,但在这种情况下,最简单的方法就是使用文字对象声明格式{name1: val1, name2: val2}。要做到这一点,更改此代码:

var add = function(firstName, lastName, email, telephone){ 
    contacts[contacts.length] = new Object(firstName, lastName, email, telephone); 
}; 

这样:

var add = function(firstName, lastName, email, telephone){ 
    contacts[contacts.length] = {firstName: firstName, lastName: lastName, email: email, phoneNumber: telephone}; 
}; 

它在这里工作:http://jsfiddle.net/jfriend00/Ea7B5/

+0

它应该是'phoneNumber'而不是'telephone'(但是你的代码可以工作,因为'printPerson'不使用它)。在这里看到:http://jsfiddle.net/SvrLw/ – Oriol

+0

@Oriol - 谢谢,我更正了属性名称。 – jfriend00

+0

谢谢,它的工作原理,但教程说这可以用构造函数new Object(firstName)来完成...... – Leahcim