自定义Array的构造函数,或使用自定义构造函数创建新的数组对象?

时间:2014-02-11 17:00:14

标签: javascript arrays constructor

我正在尝试使用一组随机的预定义值来获取数组。

假设我有一个常规值数组

var Seed = ['1', true, 3, 'false', 'five']

我希望抽出那些将其作为种子的变量,每次我都会返回它的随机版本

var randomized = new Seed();
console.log(randomized);
// 3, 'five', 1, true, 'false'

或类似的东西。但每次......

randomized = new Seed();
console.log(randomized);
// 'five', true, 'false', 1, 3

我甚至有一个nice function to actually randomize the array,但是,我的数组(种子)必须与其随机化代码一起封装在数据库模块中,这样我就可以有一种干净的new ArrayClass()方式做这个。

我不确定,但似乎如果我可以自定义Array Object的构造函数,我可以在那里插入随机化代码以及种子数组,并让它每次都抽出一个新的随机数组。

同样,我不确定它是否可能,但我已经尝试了很多东西,比如

Seed.prototype.Seed = function(){
// cannot set property Seed of undefined
}

Seed.constructor = function(){
// never gets called
}

我觉得这些东西可能会奏效,但我想我不知道我在做什么。请澄清我。

1 个答案:

答案 0 :(得分:2)

这个问题的根源似乎是“我可以将数组子类化吗?”

你可以:

function MyArray() {
    this.push("myArray");
}

MyArray.prototype = Object.create(Array.prototype);

var a = new MyArray(); // defaults to ["myArray"]

a instanceof MyArray // true
a instanceof Array // true

至于在这个问题的背景下这是否是一个好主意,这可能是一个争论的主题。取决于用例。

如果您想要的是随机化一些值,那么我同意评论中的@ Xotic750。只需创建一个函数来返回常规数组。

如果您想扩展Array类的功能而不影响本机实现,那么子类化Array是一个好主意。然后,还有一个很好的例子来直接扩展Array原型:

Array.prototype.myCustomFunction = function() {
    ...
};

var a = [...];
a.myCustomFunction();