क्या किसी फंक्शन आउटपुट को कंसोल बनाने का एक तरीका है। यह स्टेटमेंट तब दर्ज किया जाता है जब इसे कहीं पर एक ग्लोबल हुक रजिस्टर करके बुलाया जाता है (जो कि वास्तविक फ़ंक्शन को संशोधित किए बिना) या किसी अन्य माध्यम से?
क्या किसी फंक्शन आउटपुट को कंसोल बनाने का एक तरीका है। यह स्टेटमेंट तब दर्ज किया जाता है जब इसे कहीं पर एक ग्लोबल हुक रजिस्टर करके बुलाया जाता है (जो कि वास्तविक फ़ंक्शन को संशोधित किए बिना) या किसी अन्य माध्यम से?
जवाबों:
यहाँ अपनी पसंद के कार्य के साथ वैश्विक नाम स्थान में सभी कार्यों को बढ़ाने का एक तरीका है:
function augment(withFn) {
var name, fn;
for (name in window) {
fn = window[name];
if (typeof fn === 'function') {
window[name] = (function(name, fn) {
var args = arguments;
return function() {
withFn.apply(this, args);
return fn.apply(this, arguments);
}
})(name, fn);
}
}
}
augment(function(name, fn) {
console.log("calling " + name);
});
एक पक्ष यह है कि कॉल करने के बाद बनाए गए किसी भी कार्य augment
का अतिरिक्त व्यवहार नहीं होगा।
fn.apply(this, arguments);
return fn.apply(this, arguments);
return
अंतरतम समारोह में एक जोड़ने की जरूरत है ।
मेरे लिए, यह सबसे सुरुचिपूर्ण समाधान की तरह दिखता है:
(function() {
var call = Function.prototype.call;
Function.prototype.call = function() {
console.log(this, arguments); // Here you can do whatever actions you want
return call.apply(this, arguments);
};
}());
JS में इस कार्यक्षमता को प्राप्त करने के लिए प्रॉक्सी का उपयोग करने का एक नया तरीका है । यह मानकर कि console.log
जब भी किसी विशिष्ट वर्ग का कोई कार्य होता है, हम कहते हैं:
class TestClass {
a() {
this.aa = 1;
}
b() {
this.bb = 1;
}
}
const foo = new TestClass()
foo.a() // nothing get logged
हम अपनी कक्षा के तात्कालिकता को एक प्रॉक्सी के साथ बदल सकते हैं जो इस वर्ग की प्रत्येक संपत्ति को ओवरराइड करता है। इसलिए:
class TestClass {
a() {
this.aa = 1;
}
b() {
this.bb = 1;
}
}
const logger = className => {
return new Proxy(new className(), {
get: function(target, name, receiver) {
if (!target.hasOwnProperty(name)) {
if (typeof target[name] === "function") {
console.log(
"Calling Method : ",
name,
"|| on : ",
target.constructor.name
);
}
return new Proxy(target[name], this);
}
return Reflect.get(target, name, receiver);
}
});
};
const instance = logger(TestClass)
instance.a() // output: "Calling Method : a || on : TestClass"
जांचें कि यह वास्तव में कोडपेन में काम करता है
याद रखें कि उपयोग करने Proxy
से आपको सांत्वना नामों को लॉग करने की तुलना में बहुत अधिक कार्यक्षमता मिलती है।
साथ ही यह तरीका Node.js में भी काम करता है।
यदि आप अधिक लक्षित लॉगिंग चाहते हैं, तो निम्न कोड किसी विशेष ऑब्जेक्ट के लिए फ़ंक्शन कॉल लॉग करेगा। आप ऑब्जेक्ट प्रोटोटाइप को भी संशोधित कर सकते हैं ताकि सभी नए उदाहरण लॉगिंग भी प्राप्त कर सकें। मैंने इसके बजाय Object.getOwnPropertyNames का उपयोग किया ... इसलिए, यह ECMAScript 6 कक्षाओं के साथ काम करता है, जिनमें असंख्य तरीके नहीं हैं।
function inject(obj, beforeFn) {
for (let propName of Object.getOwnPropertyNames(obj)) {
let prop = obj[propName];
if (Object.prototype.toString.call(prop) === '[object Function]') {
obj[propName] = (function(fnName) {
return function() {
beforeFn.call(this, fnName, arguments);
return prop.apply(this, arguments);
}
})(propName);
}
}
}
function logFnCall(name, args) {
let s = name + '(';
for (let i = 0; i < args.length; i++) {
if (i > 0)
s += ', ';
s += String(args[i]);
}
s += ')';
console.log(s);
}
inject(Foo.prototype, logFnCall);
यहाँ कुछ जावास्क्रिप्ट है जो प्रतिस्थापित करता है। जावास्क्रिप्ट में प्रत्येक फ़ंक्शन के लिए कंसोल जोड़ता है। Regex101 पर इसके साथ खेलें :
$re = "/function (.+)\\(.*\\)\\s*\\{/m";
$str = "function example(){}";
$subst = "$& console.log(\"$1()\");";
$result = preg_replace($re, $subst, $str);
यह एक 'त्वरित और गंदा हैक' है, लेकिन मुझे यह डिबगिंग के लिए उपयोगी लगता है। यदि आपके पास बहुत सारे कार्य हैं, तो सावधान रहें क्योंकि यह बहुत सारे कोड जोड़ देगा। इसके अलावा, RegEx सरल है और अधिक जटिल फ़ंक्शन नाम / घोषणा के लिए काम नहीं कर सकता है।
आप वास्तव में लोड करने वाली हर चीज के लिए कंसोल के लिए अपने स्वयं के फ़ंक्शन को संलग्न कर सकते हैं।
console.log = function(msg) {
// Add whatever you want here
alert(msg);
}