我觉得我可能在MDN文档或其他内容中错过了一些非常简单的东西,但我已经挖掘了一段时间,而且我没有任何线索。
有没有办法以与方法类似的方式调用函数?这基本上就是我试图做的事情:
function addItem(itemName, quality, quantity /*, arr*/) {
arr.push([itemName, quality, quantity]);
}
var someArr = [['item', 1, 1]];
someArr.addItem('someOtherItem', 2, 3);
// someArr === [['item', 1, 1], ['someOtherItem', 2, 3]]

现在,请注意,我没有尝试制作构造函数或将变量定义为函数。此外,我完全清楚我可以简单地添加数组作为参数并将函数调用为正常。我想要完成的是以一种方式运行函数,当以数组方法表示时,将以指定的方式影响该数组。我怎样才能做到这一点?我可以这样做吗?
答案 0 :(得分:3)
危险方法(免责声明:P):
我不主张扩展本机对象,因此以下解决方案仅作为参考一种方式实现但实际上 非常气馁 。请参阅:THE DANGERS OF EXTENDING NATIVE OBJECTS
(venv)[ec2-user@ip-112-31-10-129 src]$ sudo nano /etc/selinux/semanage.conf
在新方法中使用Array.prototype.addItem = function addItem(itemName, quality, quantity) {
this.push([itemName, quality, quantity]);
}
var someArr = [['item', 1, 1]];
someArr.addItem('someOtherItem', 2, 3);
console.log(someArr);
// logs out: [["item", 1, 1], ["someOtherItem", 2, 3]]
并将其设置为调用该方法的对象。对于此示例,this
将是数组this
。
更好的方法:扩展
someArr
的 数组实例someArr
函数(和 NOT 本机Array对象):addItem
答案 1 :(得分:2)
如other answer所示修改Array
原型的替代方法,如果适用于您的情况,您可以将方法添加到特定数组(或对象):
function addItem(itemName, quality, quantity /*, arr*/) {
this.push([itemName, quality, quantity]);
}
var someArr = [['item', 1, 1]];
someArr.addItem = addItem;
someArr.addItem('someOtherItem', 2, 3);
var otherArray = [42];
otherArray.addItem('someOtherItem', 2, 3); // fails as otherArray does not have addItem.
请注意,这不会向所有数组(或对象)添加方法,而只会添加到您修改过的某个特定数组。这实际上可能对于添加非常特定的方法(例如在这种情况下)而非像sum
或max
这样的非常通用的情况有益,这些方法对许多类型的数组(或对象)有意义。