Javascript - 创建时对数组元素执行操作
Javascript - Performing actions on Array elements on creation
我正在尝试在 Javascript 中创建一个 Object/Class,其行为类似于数组,但具有一些附加功能。
我用这些简单的代码实现了这一点:
var Newclass = Array
Newclass.prototype.get_by_id = function(){}
但是,我正尝试在调用这个新 class 时执行一些操作,因此我添加到其中的元素会以特定方式处理(并在需要时进行转换)。
我想知道是否有一种方法可以即时实现,所以我可以这样做:
var a = New Newclass('hello', 'goodbye', 'good afternoon')
并自动将变量 a
设为(例如):
console.log(a)
["HELLO", "GOODBYE", "GOOD AFTERNOON"]
我知道如何使用循环和数组函数(如 map 等)来实现它,但我想知道 是否有覆盖构造函数的方法(在这个 Newclass
) 所以它会在创建时自动应用于每个元素,不会破坏任何东西。
编辑
感谢大家的宝贵时间和回答。但是,我必须说这不是重复的,因为我不是在问如何使用 arguments
(或者如果它们存在),而是如何在数组 的构造中使用它们derivated class,我发现这是完全不同的。
即使知道 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
将自己标识为 Array
和 uppercaseStringArray
。您可以将自己的方法添加到数组中,例如其原型中的 get_by_id
函数。
我正在尝试在 Javascript 中创建一个 Object/Class,其行为类似于数组,但具有一些附加功能。
我用这些简单的代码实现了这一点:
var Newclass = Array
Newclass.prototype.get_by_id = function(){}
但是,我正尝试在调用这个新 class 时执行一些操作,因此我添加到其中的元素会以特定方式处理(并在需要时进行转换)。
我想知道是否有一种方法可以即时实现,所以我可以这样做:
var a = New Newclass('hello', 'goodbye', 'good afternoon')
并自动将变量 a
设为(例如):
console.log(a)
["HELLO", "GOODBYE", "GOOD AFTERNOON"]
我知道如何使用循环和数组函数(如 map 等)来实现它,但我想知道 是否有覆盖构造函数的方法(在这个 Newclass
) 所以它会在创建时自动应用于每个元素,不会破坏任何东西。
编辑
感谢大家的宝贵时间和回答。但是,我必须说这不是重复的,因为我不是在问如何使用 arguments
(或者如果它们存在),而是如何在数组 的构造中使用它们derivated class,我发现这是完全不同的。
即使知道 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
将自己标识为 Array
和 uppercaseStringArray
。您可以将自己的方法添加到数组中,例如其原型中的 get_by_id
函数。