在Javascript中从对象方法中访问全局变量

时间:2016-04-05 18:00:00

标签: javascript object methods properties

我有一个相当简单的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无法访问我的列表。

4 个答案:

答案 0 :(得分:1)

您有 2 个不同的问题,

  1. 问题在于在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
    
  2. 您错误地使用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');