我有一个相当简单的JavaScript对象和一些对象方法,我试图从其中一个方法中访问/修改数组中的信息(存储在全局变量中)。这是我的代码:
var list= [];
function person(firstname, age){
this.firstname = firstname;
this.age = age;
this.addPerson = function (){
list.push({firstname, age });
}
this.addPerson();
this.changeName = function (name, newname) {
var i = 0
for (i; i < list.length; i++);{
if (list[i].firstname === name){
list[i].firstname = newname;
}
}
}
}
var person = new Bunny('Jim', 20);
var person = new Bunny('Sally',40);
person.changeName('Jim', 'John');
创建新人时,它们会自动添加到我的列表中。当我调用changeName时,我想输入我想要更改的名称和它应该是的新名称。但是,我收到错误消息“无法读取未定义的属性'名字',这使我认为changeName无法访问我的列表。
答案 0 :(得分:1)
您有 2 个不同的问题,
问题在于在for循环的括号后使用;
。这实际上导致循环体以for循环的最后一个递增值运行一次。
for (i; i < list.length; i++);{
//---------------------------^ Remove it
这就是为什么无法读取未定义错误的属性
的原因for(var i=0;i<list.length; i++); //this will run repeatedly as per for loop semantics
{ } //and this body will be executed only once with the final updated value of i
您错误地使用Bunny
启动了该对象。那应该
在我们的案例中是person
。
var person1 = new person('Sally',40);
person1.changeName('Jim', 'John');
答案 1 :(得分:1)
除了一些语法错误,您的代码设计仍然很差。这是一个更好的。
function People(){
this.list = [];
}
People.prototype.add = function(person){
this.list.push(person);
};
People.prototype.changeName = function(name,newName){
for(var i=0;i<this.list.length;i++){
var person = this.list[i];
if(person.firstname === name){
person.firstname = newName;
}
}
};
function Person(firstname,age){
this.firstname = firstname;
this.age = age;
}
//Usage
var jim = new Person('Jim', 20);
var sally = new Person('Sally',40);
var people = new People();
people.add(jim);
people.add(sally);
people.changeName('Jim', 'John');
答案 2 :(得分:0)
试试这个:
var list = [];
var Bunny = function (firstname, age){
//this.firstname = firstname;
//this.age = age;
this.addPerson = function (){
list.push({'firstname':firstname,'age': age });
}
this.addPerson();
this.changeName = function (name, newname) {
var i = 0
for (i; i < list.length; i++){
if (list[i].firstname === name){
list[i].firstname = newname;
}
}
}
}
var person = new Bunny('Jim', 20);
var person = new Bunny('Sally',40);
person.changeName('Jim', 'John');
console.log(list[0]);
你有&#39 ;;&#39;在for循环中,这就是问题所在。
答案 3 :(得分:0)
除了@ rajaprabhu的评论:
你有一个构造函数方法person()。您应该将其重命名为Person(),以符合构造函数方法的通用编码标准。
你正在创建一个Person的2个实例(在你的代码中使用Bunny不正确)在&#34; Person&#34;的上下文中。对象,您可以访问自己的范围,这意味着您可以直接更改自己的属性。在changeName方法中循环遍历列表数组的位置,您将到达对象范围之外。用以下1行代码替换循环:
this.firstName = newName;
此外,您并未将任何一个人推入列表数组。而不是
var person = new Bunny('Jim', 20);
这样做:
list.push(new Person('Jim', 20);
这会将新的Person对象添加到列表数组中。
完整编辑:
var list = [];
function Person(firstname, age) {
this.firstname = firstname;
this.age = age;
this.addPerson = function() {
list.push({
firstname,
age
});
}
this.addPerson();
this.changeName = function(name, newname) {
var i = 0
if (this.name == newname) {
this.name = newName;
}
}
}
// add the Person objects directly to the list array
list.push(new Person('Jim', 20));
list.push(new Person('Sally', 40));
// now you can select an object in the list to change its name
list[1].changeName('Jim', 'John');