मेरे पास कोड का यह उदाहरण है
let numbers = [1, 2, 3]
let summableNum = Object.assign({}, numbers, {
sum: function() {
return this.reduce(function(a, b) {
return a + b
})
}
})
परिणाम है:
{
"0": 1,
"1": 2,
"2": 3,
sum: f
}
summableNum[0] // 1
जब मैं summableNum.sum() निष्पादित करता हूं, तो मुझे यह त्रुटि होती है
ध्यान में न आया लेखन त्रुटि: this.reduce Object.sum (:4:17) पर :11:17 पर एक फ़ंक्शन नहीं है
अपेक्षित परिणाम:
summableNum.sum() // 6
क्या आप मेरी मदद कर सकते हैं
3 जवाब
आपका summableNum
{}
ऑब्जेक्ट है, जिसमें .reduce
प्रॉपर्टी नहीं है। इसके बजाय एक सरणी का प्रयोग करें:
const numbers = [1, 2, 3];
const summableNum = Object.assign([], numbers, {
sum() {
return this.reduce((a, b) => a + b, 0);
}
});
या सरणी की एक प्रति का उपयोग करें:
const numbers = [1, 2, 3];
const summableNum = Object.assign(Array.from(numbers), {
sum() {
return this.reduce((a, b) => a + b, 0);
}
});
अगर आप चाहते हैं कि nums
में कोई विधि हो sum
, तो मैं इसे प्रोटोटाइप से जोड़ने से बचूंगा... और Object.defineProperty
इस कार्य के लिए Object.assign
से अधिक उपयुक्त है।
const nums = [1, 2, 3];
Object.defineProperty(nums, 'sum', {
value: () => nums.reduce((a, b) => a + b),
});
console.log('[1,2,3].sum() =', nums.sum())
हालांकि, जाने का सही तरीका (मेरी राय में), अधिक कार्यात्मक होना है ... यदि आप डेटा को उसके व्यवहार से अलग करते हैं, तो पुन: उपयोग कोड बहुत आसान हो जाता है:
const sum = nums => nums.reduce((a, b) => a + b);
console.log(sum([1, 2, 3]));
// but also sum([55,56,57]) and so on
या तो वास्तविक सरणी उदाहरण के लिए sum
प्रॉपर्टी असाइन करें, या Array.prototype
(आमतौर पर अनुशंसित नहीं है, क्योंकि यह एक अंतर्निहित प्रोटोटाइप को बदलता है - आमतौर पर उन वस्तुओं को म्यूट करने का अच्छा विचार नहीं है जो आपके पास नहीं हैं ):
const numbers = [1, 2, 3]
// Method 1:
const summableNum1 = [...numbers];
summableNum1.sum = function() {
return this.reduce(function(a, b) {
return a + b
})
};
console.log(summableNum1.sum());
// Method 2:
Array.prototype.sum = function() {
return this.reduce(function(a, b) {
return a + b
})
};
const summableNum2 = [...numbers];
console.log(summableNum2.sum());
एक अलग विकल्प एक ऐसा वर्ग बनाना है जो extends Array
जिसमें sum
विधि हो:
// Method 3
class SummableArray extends Array {
sum() {
return this.reduce((a, b) => a + b);
}
}
const numbers = new SummableArray(1, 2, 3);
console.log(numbers.sum());