模拟阵列功能

时间:2013-11-27 22:16:45

标签: javascript

美好的一天!我有这段代码:

function MyArray() {}
MyArray.prototype.length = 0;

 (function() {
  var methods = ['push', 'pop', 'shift', 'unshift',
  'slice', 'splice', 'join'];
 for (var i = 0; i < methods.length; i++) (function(name) {
    MyArray.prototype[ name ] = function() {
     return Array.prototype[ name ].apply(this, arguments);
    };
})(methods[i]);
})();

我需要解释。我明白“方法”是一系列真正的方法,只是“导出”到我们的新类。但是,这是什么:MyArray.prototype.length = 0; ?作者创建新的prototype属性并将其赋值为零。然后使用这个新属性!

var mine = new MyArray();
mine.push(1, 2, 3);
assert(mine.length == 3 ...
.....

它是如何工作的? “长度”在上面的代码中没有实例化!

2 个答案:

答案 0 :(得分:3)

它初始化为零,这样如果你从不调用它的任何函数,它将返回零(如真实数组)而不是未定义。此外,它需要从零开始,以便方法正确更新它。在你的例子中,长度为3,因为push方法是这样做的。

答案 1 :(得分:0)

你不能真正继承Array http://perfectionkills.com/how-ecmascript-5-still-does-not-allow-to-subclass-an-array/

因此,如果您创建一个MyArray实例,则无法执行此操作:MyArr [0] = ...

您可以将数组包装在MyArray中并利用数组函数:

var MyArray=function() {
  this.arr=[];
  [].push.apply(this.arr,arguments);
  //following doesn't work in older browsers
  Object.defineProperty(this,"length",{
    get:function(){return this.arr.length;},
    enumerable:true,
    configurable:true
  });
}
MyArray.prototype.valueOf=function(){return this.arr;};
(function() {
  var methods = ['push', 'pop', 'shift', 'unshift',
  'slice', 'splice', 'join'],i=methods.length
  while(--i!==-1){
    ;(function(name) {
      MyArray.prototype[ name ] = function() {
      console.log(arguments);
        return Array.prototype[ name ].apply(this.arr, arguments);
      };
    }(methods[i]));
  }
}());

var mArr1=new MyArray(1,2,3);
console.log(mArr1.slice(0,1));
//you cannot do this: myArr1[0]=22;