Javascript прототип и модификация исходного объекта - PullRequest
1 голос
/ 06 января 2020

Как мы можем обновить переданный объект в прототипе? Я создал аналогичный прототип как Array.reverse, но как я могу изменить исходный объект?

Array.prototype.myReverse = function() {
  let arr = [];
  for (let i = 0; i < this.length; i++) {
    arr.unshift(this[i]);
  }
  return arr;
}

let a = [9, 0, 3, 4];
console.log("Before ", a); // [9, 0, 3, 4]
console.log("reverse - ", a.myReverse()); // [4, 3, 0, 9]
//not modifying original object , how to modify original object
console.log("After ", a); // [9, 0, 3, 4]

Я проверил несколько примеров, но я не понял, как обновить оригинальный объект внутри прототипа. Как мы можем создать прототип, который будет обновлять исходный объект (Осторожно: обратное разрушительно - он изменяет исходный массив.) Если это невозможно для предварительно определенного массива, то как мы можем создать аналогичный массив MyArray для написания прототипа для обновления исходного объекта.

Ответы [ 3 ]

2 голосов
/ 06 января 2020

Вы не можете назначить this напрямую, но вы все равно можете изменить его свойства. Поэтому, следуя стилю кода, который вы разместили, вы можете сделать что-то вроде:

Array.prototype.myReverse = function() {
  let arr = [...this]
  for (let i = 0; i < this.length; i++) {
    this[i] = arr.pop()
  }
}
0 голосов
/ 06 января 2020

Если вы хотите перевернуть массив на месте (и вернуть его, если хотите), вы можете создать временный стек, выдвигая заголовок массива, пока он не станет пустым, а затем толкая временные элементы, как если бы они были В очереди )

От температуры:
  • TMP → POP ⇒ ARR → UNSHIFT (LOFI)
  • TMP → SHIFT ⇒ ARR → PU SH (FOLI )

, где ARR - массив самоссылки.

if (Array.prototype.reverseItems === undefined) {
  Array.prototype.reverseItems = function() {
    let tmp = []
    while (this.length > 0) tmp.push(this.pop())    // or `tmp.unshift(this.shift()`
    while (tmp.length  > 0) this.unshift(tmp.pop()) // or `this.push(tmp.shift())`
    return this
  }
}

let original = [ 9, 0, 3, 4 ]
original.reverseItems() // in-place
console.log('Reversed:', original.join(','))
0 голосов
/ 06 января 2020

@ pointy Спасибо за предложение ..

Я изменил свойства этого и обновил исходный объект

Array.prototype.myReverse = function () {
 let arr = this.slice(); // creating a copy of array
  this.splice(0,this.length); // removing all elements from array
  for(let i = 0; i<arr.length;i++){
    this.unshift(arr[i]);
  }
  return this;
}

let a = [9,0,3,4];

console.log("Before ",a);
console.log("reverse - ", a.myReverse());
console.log("After ", a);

Несколько других ссылок для собственной реализации существующих прототипов массива

https://medium.com/@ofirrifo / naive-реализация-of- js -array- методы-a56319cad6b8

https://gist.github.com/alexhawkins/28aaf610a3e76d8b8264

Node.js изменить значение объекта Number внутри прототипа

...