0

我正在尝试在 javascript 中构建一个对象数组。不知何故,我在任何地方都找不到我正在寻找的答案。是的,我确实搜索了问题。

因此,传统对象显然具有以下属性:

item 是对象

item = new Object();

带有属性和方法

item.name = "sword"; // "sword" being the string name of the object
item.buy = buy; //buy being a function to add said item

那太好了,我明白了。

我也得到数组。

我的问题是,如果我想说 20 个这样的对象,我怎么能把它们放在一个数组中而不是制作很多对象

例如,我知道我可以做到这一点。

item1 = new Object();
item1.name = "sword";
item1.buy = buy;

item2 = new Object();
item2.name = "shield";
item2.buy = buy;

但是,我想做这样的事情

item = new Array();
item[0].name = "sword";
item[0].buy = buy;

item[1].name = "shield";
item[1].buy = buy;

也许这很明显,但我不明白这里有什么问题。

当我尝试打电话时

item[0].buy(); 

我遇到错误“Uncaught TypeError: Object 0 has no method 'buy'”并且 item[0].name 未定义。

我做错了什么,我该怎么做?

4

7 回答 7

4

我的猜测是你想要的是一个对象数组:

var item = new Array();
item[0] = {};
item[0].name = "sword";
item[0].buy = function() { return this.name };
item[0].buy();
// -> "sword"
于 2013-10-28T00:22:43.470 回答
2
// create a new array
var items = [];

// You can push objects onto the array as literals like this
items.push({
 name: "sword",
 buy: buy
});

// Or you can create the new object as you're doing currently    
var item = new Object();
item.name = "shield";
item.buy = buy;

// And push it onto the array as before
items.push(item);

// Now you can access each object by it's index in the array 
items[0].buy();
console.log(items[1].name); // "shield"
于 2013-10-28T00:22:39.187 回答
0

因为,您没有在0数组的索引处创建任何对象,buy应该是一个函数

item = new Array();
// create an object at 0/first index of array which is equivalent of new Object
item[0] = {};
// create property 'name' and assign value ("sword") to it
item[0].name = "sword";
// create another property and assign a function as it's value
// so buy is a method of the first object that is in in the item array
item[0].buy = function(){
    return 'buy called';
};
// call 'buy' method from the first object of item array
console.log(item[0].buy());
于 2013-10-28T00:23:28.340 回答
0

你可以使用这样的文字:

var items = [{
  name: '1',
  buy: buy
}, {
  name: '2',
  buy: buy
}, {
  name: '3',
  buy: buy
}];

但我会考虑使用原型,因为buy它是一种共享方法:

function Item(name) {
  this.name = name;
}

Item.prototype.buy = function() {
  ...
};

var items = [
  new Item('1'),
  new Item('2'),
  new Item('3')
];

items[1].buy();
于 2013-10-28T00:26:12.443 回答
0

可以将语法简化为:

var arr=[
    {name:'foo',age:49},
    {name:'GG', age:12},
    {name:'MMMM', age:16}
];

一切都取决于您的总体目标是什么。

使用var xyz={}类似于写出new Object()[]启动一个新数组

于 2013-10-28T00:26:12.820 回答
0

您可以创建一个调用的函数,该函数Item将返回一个具有 name 属性的对象,然后用于prototype将方法附加到它。尽管 JavaScript 没有类,但它的行为与它相似。

function Item(name) {
    this.name = name
}

Item.prototype.buy = function() {
    // your code to buy an item
    // you can access your item's name property here by using this.name
    alert("You bought the item " + this.name)
}

然后,您可以实例化此函数并将返回的对象添加到数组中:

var items = []
items.push(new Item('sword'))
items.push(new Item('shield'))
items[0].buy() // will buy the item "sword"
items[1].buy() // will but the item "shield"
于 2013-10-28T00:27:10.947 回答
0

看起来好像您没有通过 items.push(item1) 将项目添加到数组中

item1 = {};
item2 = {};

item1.name = "a";
item2.name = "b";

var buy = function() { console.log('buying... '+this.name); };

item1.buy = buy;
item2.buy = buy;

var items = [];

items.push(item1);
items.push(item2);
items[0].buy();
于 2013-10-28T00:29:59.260 回答