প্রতিটি ফাংশনে স্বয়ংক্রিয়ভাবে কনসোল.লগ যুক্ত করা হচ্ছে


97

কোনও ফাংশন আউটপুট কনসোল.লগ স্টেটমেন্ট করার কোনও উপায় আছে যখন এটি কোথাও গ্লোবাল হুক রেজিস্ট্রেশন করার মাধ্যমে বলা হয় (এটি প্রকৃত ফাংশনটি নিজেই পরিবর্তন না করে) বা অন্য কোনও মাধ্যমে?


চমৎকার প্রশ্ন, আমি এটি সম্ভব কিনা তা জানতে আগ্রহী কিন্তু আমি নিশ্চিত এটি এটি না ... সম্ভবত আপনার প্রিয় ব্রাউজারের জেএস ইঞ্জিনে এটি যুক্ত করার জন্য কোনও বৈশিষ্ট্য অনুরোধ যুক্ত করতে পারি? :-)
এন্ডোফেজ

নিখুঁত প্রশ্ন, আমার এর মতো কিছু দরকার
mjimcua

উত্তর:


62

এখানে আপনার পছন্দের কার্যকারিতা সহ গ্লোবাল নেমস্পেসের সমস্ত ক্রিয়াকলাপকে বাড়ানোর একটি উপায়:

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অতিরিক্ত আচরণ থাকবে না।


এটি সঠিকভাবে ফাংশনের রিটার্ন মানগুলি পরিচালনা করে?
সানিশাহ

4
@ সানিশাহ না এটি তা করেন না: jsfiddle.net/Shn/WnJQ5 তবে এটি একটি করেছেন: jsfiddle.net/Shopn/WnJQ5/1 যদিও আমি নিশ্চিত না যে এটি সব ক্ষেত্রে কার্যকর হবে ... পার্থক্যটি পরিবর্তিত fn.apply(this, arguments);হচ্ছেreturn fn.apply(this, arguments);
শো

4
@ শন @ সানিশাহ স্থির returnঅন্তর্নিহিত ফাংশনটিতে কেবল একটি যুক্ত করা দরকার ।
ওয়েইন

প্রায় কাজ করে জরিমানা কিন্তু আমি এই jQuery সঙ্গে কোনো ত্রুটির সম্মুখীন হয়েছেন: কল: ইন করেন (jQuery.isFunction (lSrc)) এবং এটি বলে: TypeError: jQuery.isFunction কোন ফাংশন নয়
fekiri মালেক

4
এই সমাধানটি jQuery ব্যবহার করে না
ওয়েইন

10

আমার হিসাবে এটি দেখতে সবচেয়ে মার্জিত সমাধানের মতো:

(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);
    };
}());

7

ফাংশন কলগুলিতে লগ করার জন্য প্রক্সি পদ্ধতি

জেএসে এই কার্যকারিতাটি অর্জন করতে প্রক্সি ব্যবহার করার একটি নতুন উপায় রয়েছে । ধরে নিন যে আমরা 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ব্যবহারটি আপনাকে কনসোলের নামগুলি লগ করার চেয়ে অনেক বেশি কার্যকারিতা দেয়।

এছাড়াও এই পদ্ধতিটি নোড.জেজেও কাজ করে।


উদাহরণস্বরূপ এবং ক্লাস ব্যবহার না করে আপনি কি এটি করতে পারেন? বিশেষত নোড.জেজে কথা বলছেন?
রেভাডাইক

এই সাহায্য করা উচিত @Revadike: stackoverflow.com/a/28708700/5284370
Soorena

1

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

-1

এখানে কিছু জাভাস্ক্রিপ্ট রয়েছে যা জাভাস্ক্রিপ্টের প্রতিটি ফাংশনে কনসোল.লগ যুক্ত করে; এটি Regex101 এ খেলুন :

$re = "/function (.+)\\(.*\\)\\s*\\{/m"; 
$str = "function example(){}"; 
$subst = "$& console.log(\"$1()\");"; 
$result = preg_replace($re, $subst, $str);

এটি একটি 'দ্রুত এবং নোংরা হ্যাক' তবে আমি এটি ডিবাগ করার জন্য দরকারী বলে মনে করি। আপনার যদি অনেকগুলি ফাংশন থাকে তবে সাবধান হন কারণ এটি প্রচুর কোড যুক্ত করবে। এছাড়াও, RegEx সহজ এবং সম্ভবত আরও জটিল ফাংশন নাম / ঘোষণার জন্য কাজ না করে।


-10

লোড হওয়া সমস্ত কিছুর জন্য আপনি কনসোল.লগে আপনার নিজের ফাংশনটি সংযুক্ত করতে পারেন।

console.log = function(msg) {
    // Add whatever you want here
    alert(msg); 
}

4
সঠিক বা না, এটি প্রশ্নের উত্তর দেয় না। মোটেই (যদি কেউ এখনও বিভ্রান্ত হয় তবে)
redfox05
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.