Javascript - 在创建时对Array元素执行操作

时间:2016-03-17 17:15:02

标签: javascript arrays class overwrite

我正在尝试在Javascript中创建一个Object / Class,其行为类似于Array但具有一些附加功能。

我用这些简单的方法实现了这个目标:

var Newclass = Array
Newclass.prototype.get_by_id = function(){}

但是,当我调用这个新类时,我正在尝试执行某些操作,因此我将以特定方式处理(并在需要时进行转换)处理我添加到其中的元素。

我想知道是否有办法在飞行中制作它,所以我可以做类似的事情:

var a = New Newclass('hello', 'goodbye', 'good afternoon')

并自动将变量a变为(例如):

console.log(a)
["HELLO", "GOODBYE", "GOOD AFTERNOON"]

我知道如何使用循环和数组函数(如map等),但我想知道是否还有覆盖构造函数(在{{1}上) })因此它会在创建时自动应用于其所有元素,而不会破坏任何内容

修改

感谢大家的时间和答案。但是,我必须说这不是重复,因为我不问如何使用Newclass(或者如果它们存在),但是如何使用它们来构造数组派生< / em>类,我发现它完全不同。

即使知道arguments参数存在,我仍然不知道如何在arguments的构造函数上处理这些参数,并且仍然具有此类对象的所有本机函数。

1 个答案:

答案 0 :(得分:1)

您可以制作自己的数组衍生物:

function uppercaseStringArray(){
    Array.call(this);
    for(var i = 0; i < arguments.length; i++) this.push(arguments[i]);
}
uppercaseStringArray.prototype = Object.create(Array.prototype);
uppercaseStringArray.prototype.push = function(string){
    Array.prototype.push.call(this, string.toUpperCase());
}

这与你期望的完全一样,它仍然具有普通数组所具有的所有属性:

function uppercaseStringArray(){
    Array.call(this);
    for(var i = 0; i < arguments.length; i++) this.push(arguments[i]);
}
uppercaseStringArray.prototype = Object.create(Array.prototype);
uppercaseStringArray.prototype.push = function(string){
    Array.prototype.push.call(this, string.toUpperCase());
}

var a  = new uppercaseStringArray('tomato', 'apple', 'pear');

console.log(a);

document.write('[' + a.join(', ') + ']');

您可以修改push方法以获取无限量的参数。但请注意,这是一个完整的数组,因为a[5] = 'thingy'修改数组的长度,所以请务必仅使用方法添加和删​​除数组。

这也使用Array将自己标识为uppercaseStringArrayinstanceof。您可以将自己的方法添加到数组中,例如原型中的get_by_id函数。