Javascript Array.prototype导致错误

Javascript Array.prototype导致错误,javascript,arrays,w2ui,Javascript,Arrays,W2ui,我试图在我正在处理的d3图表之一中实现w2ui 这是指向问题示例的链接 我有三个功能: //get a column of an array Array.prototype.getColumn = function(name) { return this.map(function(el) { // gets corresponding 'column' if (el.hasOwnProperty(name)) return el[name]; // removes u

我试图在我正在处理的d3图表之一中实现
w2ui

这是指向问题示例的链接

我有三个功能:

//get a column of an array
Array.prototype.getColumn = function(name) {
  return this.map(function(el) {
    // gets corresponding 'column'
    if (el.hasOwnProperty(name)) return el[name];
    // removes undefined values
  }).filter(function(el) {
    return typeof el != 'undefined';
  });
};
//remove duplicates in an array
Array.prototype.contains = function(v) {
  for (var i = 0; i < this.length; i++) {
    if (this[i] === v) return true;
  }
  return false;
};
Array.prototype.unique = function() {
  var arr = [];
  for (var i = 0; i < this.length; i++) {
    if (!arr.contains(this[i])) {
      arr.push(this[i]);
    }
  }
  return arr;
}
//获取数组的列
Array.prototype.getColumn=函数(名称){
返回此.map(函数(el){
//获取相应的“列”
如果(el.hasOwnProperty(name))返回el[name];
//删除未定义的值
}).过滤器(功能(el){
返回类型el!=“未定义”;
});
};
//删除数组中的重复项
Array.prototype.contains=函数(v){
for(var i=0;i
我需要在我的一个功能中实现这三个

问题是,每当我尝试用
Array.prototype
实现这些函数时,我都会在multiselect中得到
未定义的
项。
“undefined”
的数量与
数组.prototype
函数的数量成正比

如果我删除了这些功能,我可以让multi-select正常工作(只有multi-select部分,而不是整个图表。我不明白是什么导致了错误


非常感谢您的帮助。谢谢。

通常,在使用第三方库时,处理核心javascript对象是一个坏主意。如果您仍然希望保持这种方式并解决此特定问题,请使用Object.defineProperty方法,关闭可枚举位

比如说改变

Array.prototype.contains = function(v) {
  for (var i = 0; i < this.length; i++) {
    if (this[i] === v) return true;
  }
  return false;
};
Array.prototype.contains=函数(v){
for(var i=0;i

Object.defineProperty(Array.prototype,'contains'{
可枚举:false,
值:函数(v){
for(var i=0;i

与您添加的其他原型方法类似。

您刚刚了解了为什么修改本机原型是个坏主意。现在改为使用那些常规函数。您刚刚了解了为什么不为您的执行环境制定完整的计划就做任何事情都是个坏主意。您可以毫无问题地修改本机原型只要您需要的编码标准与该决定不冲突。因此,如果我将这些功能实现为单独的功能,它就可以工作了?例如,不尊重JS是共享环境这一事实的库可以使用
for in
来迭代数组。因为这包括所有可枚举属性(包括继承人),它可能会撞到你的扩展名。就个人而言,我会提交一个文件,但这取决于你。或者只是接受adeneo的建议……顺便说一句,这个问题不是自定义扩展名所独有的。polyfills也会有同样的问题,如果他们的库支持IE8,他们应该考虑到这一点。谢谢@Hector,它确实解决了这个问题,但我实现了使用另一个函数来完成任务,而不是使用
Array.prototype
。因为这是一个有效的解决方案,我会接受答案。可能会对某人有所帮助。
Object.defineProperty(Array.prototype, 'contains', {
    enumerable: false,
    value: function(v) {
        for (var i = 0; i < this.length; i++) {
            if (this[i] === v) return true;
        }
        return false;
    }
});