1

我的目标是根据对这个问题无关紧要的一些参数来获得一个随机对象。

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

var bob = CreateObject("Bob");
var john = CreateObject("John");
var rob = CreateObject("Rob");
var steven = CreateObject("Steven");

我是否需要将每个对象插入到数组中,或者如果我有 100 多个对象,是否有更好的方法?

4

2 回答 2

4

如果这些对象被创建但从未被销毁,您可以让构造函数为您维护一个数组并将随机函数挂钩到其中:

var CreateObject = (function() {
    var created = [];
    var CreateObject = function(name) {
        this.name = name;
        created.push(this);
    };
    CreateObject.random = function() {
        return created[Math.floor(created.length * Math.random())];
    }
    return CreateObject;
}())

var bob = new CreateObject("Bob");
var john = new CreateObject("John");
var rob = new CreateObject("Rob");
var steven = new CreateObject("Steven");

CreateObject.random();  // CreateObject {name: "Rob"}
CreateObject.random();  // CreateObject {name: "Steven"}
CreateObject.random();  // CreateObject {name: "Rob"}
CreateObject.random();  // CreateObject {name: "John"}
// etc.

该技术也可以扩展为允许删除,但您必须以某种方式明确告诉构造函数正在删除对象。否则,您的随机函数不仅无法正常工作,而且还会出现内存泄漏。

(请注意,存储数组的并不是构造函数。它存储在构造函数可以访问的闭包中。)

于 2013-09-16T11:31:10.260 回答
2

最常用、简单且高效(?)的解决方案是将所有内容存储在一个数组中,然后选择一个随机索引。

于 2013-09-16T11:07:55.770 回答