我有数组,我想自定义他的一些原型方法。如果我使用:
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。
那么我可以使用自定义原型创建数组吗?
答案 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);