Custom մեթոդներ զանգվածների համար
Custom մեթոդներ զանգվածների համար (Array.prototype override)
JavaScript-ում զանգվածները օբյեկտներ են, իսկ բոլոր զանգվածները ժառանգում են Array.prototype-ից։ Սա նշանակում է, որ մենք կարող ենք նոր մեթոդներ ավելացնել բոլոր զանգվածների վրա։
Array.prototype.first = function () { return this[0]; }; const nums = [10, 20, 30]; console.log(nums.first()); // 10
Այստեղ մենք ստեղծեցինք first() մեթոդ, որը վերադարձնում է զանգվածի առաջին անդամը։
Չնայած որ սա տեխնիկապես հնարավոր է, լավ պրակտիկա չի համարվում։ Քանի որ Array.prototype-ի փոփոխությունը ազդում է բոլոր զանգվածների վրա, դա կարող է առաջացնել անսպասելի բագեր, հատկապես երբ օգտագործվում են երրորդ կողմի գրադարաններ։
Array.prototype.random = function () { return this[Math.floor(Math.random() * this.length)]; }; const a = [1, 2, 3]; for (let i in a) { console.log(i); // կտպի նաև "random" }
Ավելի անվտանգ տարբերակ՝ օգտագործել Object.defineProperty
Object.defineProperty(Array.prototype, 'random', { value: function () { return this[Math.floor(Math.random() * this.length)]; }, enumerable: false, // սա թաքցնում է մեթոդը `for...in` և `Object.keys`-ից });
const getRandom = (arr) => { return arr[Math.floor(Math.random() * arr.length)]; }; getRandom([10, 20, 30]);
Կոմպոզիցիան շատ ավելի կանխատեսելի է, test-երի մեջ ավելի հարմար և չի փոխում գլոբալ վիճակը։
✅ Լավ է | ❌ Վատ է |
Կոմպոզիցիա / ֆունկցիա | Array.prototype-ի փոփոխում |
Object.defineProperty-ով անտեսանելի դարձնել | Բաց թողնել enumerable: false |
Scoped լուծումներ | Գլոբալ ազդեցություն |
Object.defineProperty(Array.prototype, 'last', { value: function () { return this[this.length - 1]; }, enumerable: false, }); [1, 2, 3].last(); // 3
Array.prototype-ին մեթոդ ավելացնելը կարող է հետաքրքիր լինել՝ փորձարարական կամ կրթական նպատակով, բայց արտադրողական միջավայրում խորհուրդ է տրվում խուսափել դրանից։ Ավելի լավ է օգտագործել սովորական ֆունկցիաներ, կոմպոզիցիա կամ գրադարաններ։