我正在为提供更多功能的常见JavaScript类型创建包装器。除了新的方法和属性外,它们还具有与其包装类型相同的所有方法和属性。尽管可能会改变它们的逻辑,但我并没有完全重写现有的方法,因此,我总是在包装值上回调原始方法。
charCodeAt
可能是字符串包装的样子:
this.charCodeAt = function (index) {
return internalValue.charCodeAt(index);
};
在上面的示例中,我不需要做很多事情:
index
的调用中的参数string.charCodeAt
是可选的,因此我不需要编写任何逻辑来处理对{{1 }}。wrapper.charCodeAt
是index
唯一的参数,因此也无需处理传递给string.charCodeAt
的其他变量,因为它们将被忽略。我在尝试调用接受可变数量参数的方法时遇到问题。有问题的方法是wrapper.charCodeAt
。在其他情况下,我编写了代码以将任意数量的参数传递给JavaScript中的函数,而我使用的解决方案是array.concat
,其中func.apply(null, argumentArray)
是我想要的参数数组传递给argumentArray
。这不适用于func
:
.concat
写入控制台的错误消息显示var array = [0, 1];
var error;
try {
array.concat.apply(null, [2, 3]);
} catch (error) {
console.log(error);
}
。我研究了将TypeError: Array.prototype.concat called on null or undefined
与apply
一起使用,似乎在构造函数原型上定义的其他方法也会遇到类似的问题。
为什么concat
遇到此问题?将任意数量的参数作为数组传递给诸如array.concat.apply
之类的方法的正确方法是什么?
答案 0 :(得分:1)
调用原型方法并在对this
的调用中正确设置apply()
自变量应该起作用:
var array = [0, 1];
var error;
try {
array = Array.prototype.concat.apply(array, [2, 3]);
} catch (error) {
console.log(error);
}
console.log(array);
答案 1 :(得分:1)
apply
期望数组(或类似数组)对象的this
值。当你做
array.concat.apply(null, [2, 3]);
this
的值为null
;实际上与
Array.prototype.concat.apply(null, [2, 3]);
任何对原始array
的引用都将被忽略。
如果要使用concat
输出原始数组的[2, 3]
,则需要指定this
的值应为array
:
var array = [0, 1];
var arrayToConcat = [2, 3];
const result = array.concat.apply(array, arrayToConcat);
console.log(result);
// or, use array spread:
const result2 = [...array, ...arrayToConcat];
console.log(result2);
// or, use concat without anything special at all:
const result3 = array.concat(arrayToConcat);
console.log(result3);
(从技术上讲,您可以使用非数组对象作为this
的{{1}},但这很奇怪)