我正在使用这个相对简单的代码:
Array.prototype.doubleAll = function () {
output = [];
for (var i = 0; i < this.length; i++) {
output.push(this[i] * 2);
}
return output;
};
console.log([1,2,3].doubleAll());
Array.prototype.myEach = function (fun) {
output = [];
for (var i = 0; i < this.length; i++) {
output.push(fun(this[i]));
}
return output;
};
a = [1,2,3];
a.myEach(function (num) {
console.log(num);
});
第一个console.log
命令,直接在数组上调用而不是指向数组的变量,工作正常;第二个console.log
适用于指向数组的变量,但不能直接在数组上运行。
例如,
[1,2,3].myEach(...)
失败了,但是
[1,2,3].doubleAll()
和
a.myEach(...)
都工作。
编辑:
在[1,2,3]而不是变量a(== [1,2,3])上调用myEach时返回的错误是
[1,2,3].myEach(function (num) {
^
TypeError: Cannot call method 'myEach' of undefined
有人可以向这个新手解释一下这种情况的原因吗?
答案 0 :(得分:0)
我不知道你有什么错误,但我在node.js上尝试了这个并且它运行良好:
Array.prototype.doubleAll = function () {
var output = [];
for (var i = 0; i < this.length; i++) {
output.push(this[i] * 2);
}
return output;
};
console.log([1,2,3].doubleAll());
Array.prototype.myEach = function (fun) {
for (var i = 0; i < this.length; i++) {
fun(this[i]);
}
};
[1,2,3,4,5].myEach(function (num) {
console.log(num);
});
当然,你不需要输出“var in myEach,因为你什么都不返回,你调用函数代替。第二个问题,你必须为输出添加“var”,否则它会成为一个全局变量,可能会有意想不到的哈巴狗。
答案 1 :(得分:0)
输出未在函数中声明,并且将创建window.output但代码仍然有效:
Array.prototype.myEach = function (fun) {
var output = [],i;
for (i = 0; i < this.length; i++) {
output.push(fun(this[i]));
}
return output;
};
[1,2,3].myEach(function (num) {
console.log(num);
});
扩展本机对象breaks encapsulation,但如果您的代码永远不会与第三方库一起运行,那么就不必担心太多了。