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

Javascript - Performing actions on Array elements on creation

本文关键字:数组元素 执行 操作 创建 Javascript      更新时间:2023-09-26

我正在尝试在Javascript中创建一个对象/类,它的行为类似于数组,但具有一些附加功能。

我通过这些简单的线条实现了这一目标:

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 等)来做到这一点,但我想知道是否有任何方法可以覆盖构造函数(在此Newclass上),以便它在创建时自动应用于其每个元素,而不会破坏任何东西

编辑

谢谢大家的时间和答案。但是,我必须说这不是重复的,因为我不是在问如何使用arguments(或者它们是否存在),而是如何在构造 Array 派生类时与他们合作,我发现这是完全不同的。

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

您可以创建自己的数组导数:

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'不会修改数组的长度,因此请确保仅使用在数组中添加和删除的方法。

这也使用instanceof将自己标识为ArrayuppercaseStringArray。您可以将自己的方法添加到数组中,就像其原型中的get_by_id函数一样。