কোনও ফাংশন আউটপুট কনসোল.লগ স্টেটমেন্ট করার কোনও উপায় আছে যখন এটি কোথাও গ্লোবাল হুক রেজিস্ট্রেশন করার মাধ্যমে বলা হয় (এটি প্রকৃত ফাংশনটি নিজেই পরিবর্তন না করে) বা অন্য কোনও মাধ্যমে?
কোনও ফাংশন আউটপুট কনসোল.লগ স্টেটমেন্ট করার কোনও উপায় আছে যখন এটি কোথাও গ্লোবাল হুক রেজিস্ট্রেশন করার মাধ্যমে বলা হয় (এটি প্রকৃত ফাংশনটি নিজেই পরিবর্তন না করে) বা অন্য কোনও মাধ্যমে?
উত্তর:
এখানে আপনার পছন্দের কার্যকারিতা সহ গ্লোবাল নেমস্পেসের সমস্ত ক্রিয়াকলাপকে বাড়ানোর একটি উপায়:
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);
};
}());
জেএসে এই কার্যকারিতাটি অর্জন করতে প্রক্সি ব্যবহার করার একটি নতুন উপায় রয়েছে । ধরে নিন যে আমরা 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
ব্যবহারটি আপনাকে কনসোলের নামগুলি লগ করার চেয়ে অনেক বেশি কার্যকারিতা দেয়।
এছাড়াও এই পদ্ধতিটি নোড.জেজেও কাজ করে।
আপনি যদি আরও লক্ষ্যবস্তু লগিং চান তবে নিম্নলিখিত কোডটি কোনও নির্দিষ্ট অবজেক্টের জন্য ফাংশন কলগুলিতে লগ করবে। আপনি এমনকি অবজেক্ট প্রোটোটাইপগুলি সংশোধন করতে পারেন যাতে সমস্ত নতুন দৃষ্টান্ত লগইন হয়। আমি ... এর পরিবর্তে অবজেক্ট.জেটঅনপ্রনির নামগুলি ব্যবহার করেছি, সুতরাং এটি 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);
}