使用prototype实现数组,其方法实现了Array原型的包装

时间:2014-10-29 12:43:28

标签: javascript arrays prototype

我有数组,我想自定义他的一些原型方法。如果我使用:

arr.push = function(){
  doSomething()
  Array.prototype.push.call(arguments);
}

我正在为push创建自己的属性arr。但我想制作一个新的类似数组的对象,它将使用上一个示例中的方法push进行原型化。我试图做这样的事情:

// creating new object which prototype linked to _Array.prototype
var newArr = new (function _Array(){});

// setting up method     
_Array.prototype.push = function(){...}

// copying all data
arr.forEach(function(val, index){ 
  newArr[index] = val;
});
newArr.length = arr.length

//updating original array
arr = Array.prototype.slice.call(newArr);

是的,之后我会得到类似数组的对象,但是Array.prototype.slice返回的对象绑定了不是由我创建的Array原型_Array.prototype。

那么我可以使用自定义原型创建数组吗?

2 个答案:

答案 0 :(得分:1)

您可以这样创建自己的数组:

// create own Array object
var _Array = function()  {};

// inherit from Array
_Array.prototype = Object.create(Array.prototype);
// reset constructor
_Array.prototype.constructor = _Array;
// overwrite push method
_Array.prototype.push = function(){
    doSomething()
    Array.prototype.push.apply(this, arguments);
};

你可以像这样使用它:

// create own array
var newArr = new _Array();

// push to array
newArr.push(1, 2, 3);

// create copy
var arr = newArr.slice();

答案 1 :(得分:1)

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

例如;使用_Array:

var arr = new _Array();
arr[10]=22;
console.log(arr.length);//=0

取决于您希望扩展阵列的行为类似于数组。

在这种情况下,最好只在每个数组实例上添加该函数,并将数组实例保留为数组实例,而不是创建一个从Array“继承”的类型(因为它不可能从Array继承):

function createSpecialArray(){
  var ret = new Array(arguments);
  //shadow push
  ret.push = createSpecialArray.push;
  return ret;
};
createSpecialArray.push=function(){
  //do other stuff
  console.log('doing other stuff');
  Array.prototype.push.call(this,arguments);
}

var arr = createSpecialArray(1,2,3);
console.log(arr);
arr[10]=22;
console.log(arr.length);
arr.push(33);
console.log(arr.length);