Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中对数组更新/创建运行自定义方法_Javascript_Arrays_Prototype - Fatal编程技术网

在JavaScript中对数组更新/创建运行自定义方法

在JavaScript中对数组更新/创建运行自定义方法,javascript,arrays,prototype,Javascript,Arrays,Prototype,我知道如何向对象添加自定义属性 假设我有一个foo方法 const foo = () => { console.log('custom method'); } 我可以将foo方法添加到数组原型中,并通过 Array.prototype.foo = foo; 然后如果我创建一个名为 bar = [1, 2, 3]; 跑 bar.foo() 它将执行我的自定义foo方法。但是我不知道每次创建数组和更新数组时如何运行foo方法 我想在JavaScript中创建/更新数组期间运行一个自定义

我知道如何向对象添加自定义属性

假设我有一个foo方法

const foo = () => { console.log('custom method'); }
我可以将
foo
方法添加到数组原型中,并通过

Array.prototype.foo = foo;
然后如果我创建一个名为

bar = [1, 2, 3];

bar.foo()
它将执行我的自定义foo方法。但是我不知道每次创建数组和更新数组时如何运行
foo
方法

我想在JavaScript中创建/更新数组期间运行一个自定义方法并存储一些数据。我该怎么做

假设我有一个自定义方法

const customMethod = () => {
   ...doing some stuff    
}
我希望每次创建数组时都运行此自定义方法,并在该数组中存储一些数据。就像我想找到数组的最大值,并使用键
maximum
将其存储在数组中,因为我们现在正在存储
length
。因此,在创建/更新阵列后,我不必计算最大值。我可以直接调用myArray.maximum,然后得到最大值

做类似的事情。但它需要添加事件侦听器和一个新的推送方法,以便每次使用该自定义推送方法将某个事件推送到数组中时都可以触发事件。但在这种情况下,如果我使用常规的
Array.prototype.push
方法或使用如下扩展运算符创建新数组,
newArr=[…oldArray,value]
,我的自定义函数将不会更新

更新:搜索后,在注释中链接的帮助下,我发现如果不扩展数组对象或从头创建自定义数组类型(这是不可接受的),就无法修改数组对象

我试图扩展现有的数组类型并创建MyCustomArray。但它根本不能作为数组工作

class MyCustomArray extends Array {
   constructor(...args) {
      super(...args);
      console.log('custom array');
   }
}
您知道如何扩展数组以创建CustomArray类型并向其添加侦听器,以便每次创建/更新CustomArray时,它都会计算最大值并将其设置为数组最大值属性(代码更改最少)

因此,我的CustomArray将像普通数组一样拥有所有的方法和实例变量。但它会做一件额外的事情,每次我更新/创建CustomArray时,它都会计算该数组中的最大值并将其设置为属性。

我认为你不能像那样“劫持”所有数组。即使您使用本机的
数组
函数进行修补,使用文字符号即
[]
创建的数组也不会受到以下影响:

console.log(新数组(1,2,3));
控制台日志([4,5,6]);
数组=函数(){
抛出新的错误;
};
试一试{
log(新数组(1,2,3));
}捕获(e){
log('无法使用新数组创建数组');
}

控制台日志([4,5,6])好吧,这有点暴力,但是数组是这样的,如果你为扩展类提供一个构造函数,它创建新数组的方法将使用这个构造函数,例如,
myCustomArray.filter
将生成
myCustomArray
对象结果,而不是
Array
对象结果。(如果不提供构造函数,则此操作无效)

如果我想随时访问该自定义类型的数组的特定自定义功能,我可能会在创建时将值设为null,并扩展将现有对象(如
pop
)更改为null的方法,然后使用一个方法提供非null缓存值,或计算,缓存并返回当前值


我没有仔细研究和计算,但我认为只有少数几种数组方法可以更改现有的数组(而不是创建一个新的数组),因此不需要太多的工作。

这是否回答了您的问题?不是真的。在每次更新和创建数组的过程中,我都在寻找自定义数组对象的方法。“我知道如何向对象添加自定义属性”-您能说明这是什么意思吗?也许有一些代码说明了如何让自定义方法在每次创建非数组对象或在其中存储数据时运行?就像我可以将
foo
方法添加到数组原型并使用数组变量调用它一样<代码>Array.prototype.foo=foo。然后,如果我创建一个名为
bar
的数组并运行
bar.foo()
它将执行我的自定义foo方法。但我不知道如何在每次创建数组和更新数组时运行
foo
方法。@sabbir.alam您不能这样做,不可能劫持“每个数组”。但是,您可以显式地包装一些特定的数组,以便控制它们的更新方式,并且在更新过程中还可以执行任何您想要的操作。您的意思是代理是针对单个数组实例的,对吗?@sabbir.alam是的。但我相信我们可以写一个代理,返回另一个代理。现在,这已经超出了我的想象。在我可以看到返回新代理的模式的地方,一些理解代理的指针会很好。一个离题的问题,为什么每个人都像这样双重引用劫持
“劫持”
?:)@sabbir.alam我只是想说,你不能像那样免费自动截获所有电话。(不过我的意思并不坏:)