在原型设计时如何更改阵列

时间:2013-06-20 21:36:07

标签: javascript arrays prototype

我正在编写一个自定义排序函数,我正在将其原型化为Array。 (请不要发布答案向我解释为什么我不应该为了原型而将原型设计成数组,因为你认为原型设计成Array并不是一个好主意。)

所以,我的方法看起来像这样:

//method
Array.prototype.mySort = function(memberName, ascOrDesc){
    var labelRow = this.shift();   
    var ret = this.sort((function (a,b){
        if(ascOrDesc > 0)
            return (a[memberName] > b[memberName])?1:-1; 
        return (a[memberName] < b[memberName])?1:-1;    
    }));    
    ret.unshift(labelRow)
    return ret;
}

注意this.shift()将如何影响Array IN PLACE。

但是,我不清楚这是如何实现的。如果我想编写自己的myShift方法,在某些时候我需要说出一些有关

的效果的内容。
this = this.myShift();

这显然是非法的。

所以,我试图理解shift()如何访问数组的成员,并能够就地删除第一个。如果我被允许做类似的事情,或者如果这种方式被烘焙并且我无法使用。

2 个答案:

答案 0 :(得分:2)

您可以使用方法中的this访问数组。

您可以将shift方法实现为:

Array.prototype.myShift = function() {
  if (this.length == 0) return null;
  var result = this[0];
  for (var i = 1; i < this.length; i++) {
    this[i-1] = this[i];
  }
  this.length--;
  return result;
};

答案 1 :(得分:1)

问题是您无法分配到this。这意味着你不能做这样的事情:

Array.prototype.myShift = function() {
    this = this.slice(1);
}; 

这是因为Array.prototype.slice返回一个新数组而不修改旧数组。但是,其他方法,例如Array.prototype.splice 修改旧数组。所以你可以这样做:

Array.prototype.myShift = function() {
    return this.splice(0, 1)[0];
};

这与标准Array.prototype.shift方法具有完全相同的行为。它会修改当前数组,因此您可以执行此操作:

var labelRow = this.myShift();