Помогите с переопределением массива
Доброго времени суток, уважаемыке знатоки! Дали задание переопределить метод splice :)
функция не дописана, ещё не реализовывал добавление элементов. проблема собственно такого характера: как переопределить исходный массив? this = Arr не прмогает :(
Array.prototype.splice = function (start, deleteCount) {
var removedArr = [];
var Arr = [];
for ( var i = start; i <= deleteCount; i++ ) {
removedArr.push( this[i] );
}
for ( var j = 0; j < start; j++) {
Arr.push(this[j]);
}
for ( var n = deleteCount+1; n < this.length; n++ ) {
Arr.push(this[n])
}
return removedArr;
};
|
this.length = 0; this.push.apply(this, Arr); |
Цитата:
|
В результате получил такой код
Array.prototype.splice = function (start, deleteCount) {
var removedArr = [];
var Arr = [];
if (start < 0){
start = this.length + start;
}
for ( var i = start; i <= start + deleteCount-1; i++ ) {
removedArr.push( this[i] );
}
for ( var j = 0; j < start; j++) {
Arr.push(this[j]);
}
for (var a = 2; a <= arguments.length; a++){
if (typeof arguments[a] == 'undefined'){
break;
} else {
Arr.push(arguments[a]);
}
}
for ( var n = start+deleteCount; n < this.length; n++ ) {
Arr.push(this[n])
}
this.length = 0;
this.push.apply(this, Arr);
return removedArr;
};
|
Цитата:
Array.prototype.splice = (function(method) {
return function() {
return method.apply(this, arguments);
};
}(Array.prototype.splice));
var arr = [1,2,3];
arr.splice(1, 1);
alert(arr);
|
NuclleaR, в твоём варианте есть несоответствие нативному методу:
var array = [,,]; array.splice(0, 1); 0 in array; // должно быть false, у тебя - true А используя метод .slice, можно избавиться от циклов и значительно сократить код. Я бы сделал так:
Array.prototype.splice = function (start, deleteCount) {
if (start < 0) start += this.length;
if (start > this.length) start = this.length;
var removed = this.slice(start, start + deleteCount);
var tail = this.slice.call(arguments, 2).concat(this.slice(start + deleteCount));
this.length = start + tail.length;
for(var i = 0; i < tail.length; i++) {
if (i in tail) this[start + i] = tail[i];
else delete this[start + i];
}
return removed;
};
Вроде такая реализация идентична нативной. |
Цитата:
Array.prototype.splice = function() {
alert('splice');
};
var arr = [1,2,3];
arr.splice(1, 1);
|
Цитата:
|
nerv_, Sweet,
Заданием было написать метод идентичный нативному slice. я пока учусь и таких тонкостей var array = [,,]; array.splice(0, 1); 0 in array; // должно быть false, у тебя - true не знаю |
Спасибо за ответы
|
:lol:
Array.prototype.splice = function() {
var fr = document.createElement('iframe'), splice;
fr.style.display = 'none';
document.body.appendChild(fr);
splice = fr.contentWindow.Array.prototype.splice;
document.body.removeChild(fr);
return splice;
}
|
Да ё-моё:
Array.prototype.splice = Array.prototype.splice |
Цитата:
var natural = Array.prototype.splice; Array.prototype.splice = Array.prototype.splice; alert(Array.prototype.splice === natural); // true, а должно быть false http://javascript.ru/forum/misc/4652...tml#post307507 |
| Часовой пояс GMT +3, время: 14:40. |