亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 JavaScript 中對數組更新/創建運行自定義方法

在 JavaScript 中對數組更新/創建運行自定義方法

幕布斯6054654 2023-07-06 10:19:23
我知道如何向對象添加自定義屬性。假設我有一個 foo 方法,const foo = () => { console.log('custom method'); }我可以將該foo方法添加到數組原型并使用數組變量調用它Array.prototype.foo = foo;然后如果我創建一個名為的數組,bar = [1, 2, 3];并運行bar.foo()它將執行我的自定義 foo 方法。但我不知道如何foo在每次創建數組和每次更新數組時運行該方法。我想運行一個自定義方法并在 JavaScript 中創建/更新數組期間存儲一些數據。我怎么做?可以說我有一個自定義方法,const customMethod = () => {? ?...doing some stuff? ??}我希望這個自定義方法在每次創建數組時運行并在該數組中存儲一些數據。就像我想找到數組的最大值并將其存儲在帶有鍵的數組中,maximum就像我們length現在存儲的那樣。這樣在創建/更新數組后我就不必計算最大值。我只要打電話myArray.maximum就能得到最大值。這種方法做了類似的事情。但它需要添加事件偵聽器和新的推送方法,以便每次使用該自定義推送方法將某些內容推送到數組時都可以觸發事件。Array.prototype.push但在這種情況下,如果我使用常規方法或使用像這樣的擴展運算符創建新數組,我的自定義函數將不會更新newArr = [...oldArray, value]。我嘗試擴展現有的數組類型并創建 MyCustomArray。但它根本不能作為數組工作。class MyCustomArray extends Array {? ?constructor(...args) {? ? ? super(...args);? ? ? console.log('custom array');? ?}}知道如何擴展數組來創建我的 CustomArray 類型并向其添加偵聽器,以便每次創建/更新 CustomArray 時它都會計算最大值并將其設置為數組 max 屬性(只需最少的代碼更改)?所以我的 CustomArray 將擁有像普通數組一樣的所有方法和實例變量。但它會做一件額外的事情,每次我更新/創建 CustomArray 時,它都會計算該數組中的最大值并將其設置為屬性。
查看完整描述

3 回答

?
慕的地10843

TA貢獻1785條經驗 獲得超8個贊

我不認為你可以像這樣“劫持”所有數組。即使您對本機Array函數進行猴子修補,使用文字符號 ie 創建的數組也[]不會受到影響:

console.log(new Array(1,2,3));

console.log([4,5,6]);


Array = function () {

  throw new Error;

};


try {

  console.log(new Array(1,2,3));

} catch (e) {

  console.log('Cannot create array with new Array');

}


console.log([4,5,6]);

正如您可能認為的那樣,您需要將數組傳遞給其他東西。您只需選擇適合您的解決方案即可。就我個人而言,我會嘗試使用代理:


const spy =

  (arr, fn) =>

    new Proxy(arr, {

      get(target, prop) {

        if (prop === "max") {

          return Math.max(...target);

        }

        if (prop === "min") {

          return Math.min(...target);

        }

        if (typeof target[prop] === "function") {

          fn();

        }

        return target[prop];

      }

    });



const arr = spy([1,2,3], () => console.log('spied'));

arr.push(500);

arr.push(-10);


console.log(arr.min, arr.max, JSON.stringify(arr), Array.isArray(arr));

我喜歡代理的一點是,它可以被設計成不會造成妨礙。上面的例子中arr仍然是一個數組。您可以做您以前做過的所有正常事情。例如Array.isArray仍然返回trueJSON.stringify仍然產生預期結果。

但是請注意,在上面的實現中,如果您從中生成另一個數組,arr則不會自動代理:

const arr = spy([1,2,3], fn);
arr.slice(1); // [2,3] (non-proxied array!)


查看完整回答
反對 回復 2023-07-06
?
白衣染霜花

TA貢獻1796條經驗 獲得超10個贊

你在這里有正確的想法:


class MyCustomArray extends Array {

   constructor(...args) {

      super(...args);

      console.log('custom array');

   }

}

您只需要更改要Array擴展類的類,它應該是Array<T>這樣Array的:


class MyCustomArray extends Array<T> {

   constructor(...items) {

      super(...items);

      console.log('custom array');

   }

}

這里的<T>T 代表數組中包含的對象的類型,例如,如果它將是一個僅包含數字的數組,那么您可以將<number>.


現在您可以向該數組添加任何功能并使用以下語法創建該數組的實例:


const array = new MyCustomArray(item1, item2...)

希望這可以幫助


查看完整回答
反對 回復 2023-07-06
?
手掌心

TA貢獻1942條經驗 獲得超3個贊

嗯,它有點暴力,但是,Array 有點特殊,因為如果您為擴展類提供構造函數,則其創建新數組的方法將使用該構造函數,因此,例如,myCustomArray.filter會生成myCustomArray對象結果而不是一個Array對象結果。(如果您不提供構造函數,則這不起作用)。

如果我想隨時訪問該自定義類型中數組的特定自定義功能,我可能會在創建時將值設置為 null,并擴展更改現有對象(如 )的方法以將其設置為 null,然后將其設置為 null?pop。一種方法,該方法可以提供非空緩存值,或者計算、緩存并返回當前值。

我沒有仔細計算,但我認為只有少數數組方法可以更改現有數組(而不是創建新數組),因此應該不需要太多努力。


查看完整回答
反對 回復 2023-07-06
  • 3 回答
  • 0 關注
  • 171 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號