Javascript 原型和修改原始对象
Javascript prototype and modify original object
我们如何更新原型中传递的对象?我已经创建了与 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 来编写用于更新的原型原始对象。
您不能直接分配 this
,但您仍然可以更改其属性。因此,保持您发布的代码的风格,您可以按照以下方式做一些事情:
Array.prototype.myReverse = function() {
let arr = [...this]
for (let i = 0; i < this.length; i++) {
this[i] = arr.pop()
}
}
@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-implementation-of-js-array-methods-a56319cad6b8
https://gist.github.com/alexhawkins/28aaf610a3e76d8b8264
如果你想原地反转数组(如果你愿意,return它),你可以创建一个临时堆栈,方法是弹出数组的头部直到它为空,然后将临时元素,就好像它们在队列中一样。
- 至温度:
- ARR→POP ⇒ TMP→PUSH (LILO)
- ARR→SHIFT ⇒ TMP→UNSHIFT(先进先出)
- 来自温度:
- TMP→POP ⇒ ARR→UNSHIFT (LOFI)
- TMP→SHIFT ⇒ ARR→PUSH (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(','))
我们如何更新原型中传递的对象?我已经创建了与 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 来编写用于更新的原型原始对象。
您不能直接分配 this
,但您仍然可以更改其属性。因此,保持您发布的代码的风格,您可以按照以下方式做一些事情:
Array.prototype.myReverse = function() {
let arr = [...this]
for (let i = 0; i < this.length; i++) {
this[i] = arr.pop()
}
}
@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-implementation-of-js-array-methods-a56319cad6b8
https://gist.github.com/alexhawkins/28aaf610a3e76d8b8264
如果你想原地反转数组(如果你愿意,return它),你可以创建一个临时堆栈,方法是弹出数组的头部直到它为空,然后将临时元素,就好像它们在队列中一样。
- 至温度:
- ARR→POP ⇒ TMP→PUSH (LILO)
- ARR→SHIFT ⇒ TMP→UNSHIFT(先进先出)
- 来自温度:
- TMP→POP ⇒ ARR→UNSHIFT (LOFI)
- TMP→SHIFT ⇒ ARR→PUSH (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(','))