从关联数组启动对象

Initiate objects from associative array

我想使用 init() 方法来启动通过 for..in 循环从关联数组中获取的对象:

var person = {name: null, id: null}

person.init = function(name){
    this.name = name;
    this.id = "##" + this.name;
}

var pers1 = Object.create(person);
var pers2 = Object.create(person);

var personArray = {pers1: "John", pers2: "Alice"};

for (var i in personArray){
    console.log(i);
    console.log(personArray[i]);
    console.log(i.name);
    i.init(personArray[i]);
}

输出:

pers1
John       
undefined  // pers1.name
TypeError: i.init is not a function  //But not pers1.init() ?

为什么我可以调用.name属性但不能调用.init()方法? 更重要的是,有没有办法调用数组中对象的方法?

我是 JS 初学者,如果代码看起来有点奇怪,我很抱歉。

Why can I call the .name attribute but not the .init() method?

在JavaScript中,您可以访问对象上不存在的属性;当你这样做时,你会得到值 undefined. 这就是你正在做的:personArray(不是数组)上的属性值是字符串,并且没有 nameinit 属性。这对于访问 .name 没问题,因为您所做的只是将它传递给 console.log,但是对于 .init 会出现错误,因为您试图将 undefined 作为函数调用.

主要问题是您在对象(它不是数组)中的属性与您的 person 函数没有任何关系,也与您的 pers1 没有任何关系和 pers2 个对象。

如果您的目标是从一个属性值只是名称的对象开始,然后使用 person对象,你可以这样做:

var person = {name: null, id: null};

person.init = function(name){
    this.name = name;
    this.id = "##" + this.name;
};

var personMap = {pers1: "John", pers2: "Alice"};

var name;
for (var i in personMap) {
    name = personMap[i];
    personMap[i] = Object.create(person);
    personMap[i].init(name);
}
var personArray = {pers1: "John", pers2: "Alice"};

此行正在创建一个新对象,它只包含分配给字符串 "John""Alice" 的键 pers1pers2,您没有分配您创建的对象