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-ին մեթոդ ավելացնելը կարող է հետաքրքիր լինել՝ փորձարարական կամ կրթական նպատակով, բայց արտադրողական միջավայրում խորհուրդ է տրվում խուսափել դրանից։ Ավելի լավ է օգտագործել սովորական ֆունկցիաներ, կոմպոզիցիա կամ գրադարաններ։