প্রোগ্রামে কোনও জাভাস্ক্রিপ্ট ফাংশনে কোড যুক্ত করা হচ্ছে


114

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

var someFunction = function(){
    alert("done");
}

আমি কোনওভাবে সেই ফাংশনে কিছু জেএস কোড সংযোজন বা প্রেন্ডেন্ড করতে সক্ষম হতে চাই। মূলত কারণটি হ'ল মূল অস্পৃশ্য জেএসে ফাংশনটি বেশ বিরাট এবং যদি জেএস কখনও আপডেট হয়ে যায় তবে আমি যে ফাংশনটি দিয়ে এটিকে ওভাররাইট করে তা পুরানো হয়ে যাবে।

আমি এটি নিশ্চিত যে পুরোপুরি নিশ্চিত নই, তবে আমি অনুভব করেছি যে আমি এটি পরীক্ষা করব।


3
প্রথম উত্তর এই আপনি সাহায্য করা উচিত
DarkAjax

আপনি কি কলব্যাক ফাংশনের মতো কিছু চান?
sinemetu1

উত্তর:


219

যদি someFunctionবিশ্বব্যাপী উপলভ্য থাকে তবে আপনি ফাংশনটি ক্যাশে করতে পারেন, নিজের তৈরি করতে পারেন এবং আপনার কাছে এটি কল করতে পারেন।

সুতরাং এটি যদি আসল হয় ...

someFunction = function() {
    alert("done");
}

আপনি এটা করতে চাই ...

someFunction = (function() {
    var cached_function = someFunction;

    return function() {
        // your code

        var result = cached_function.apply(this, arguments); // use .apply() to call it

        // more of your code

        return result;
    };
})();

এই হৈচৈ


লক্ষ্য করুন যে আমি .applyক্যাশেড ফাংশনটি কল করতে ব্যবহার করি । এটি আমাকে প্রত্যাশিত মান ধরে রাখতে thisএবং যত আর্গুমেন্ট স্বতন্ত্র যুক্তি হিসাবে পাস হয়েছিল তা নির্ধারণ করতে দেয় যতগুলিই থাকুক না কেন।


10
এই উত্তরটি সত্যিই শীর্ষস্থানীয় হওয়া উচিত - এটি আমার কাছ থেকে প্রশ্নে ফাংশনটির কার্যকারিতা সংরক্ষণ করে ... +1।
রিড

17
ব্যবহারের জন্য +1 apply: এটিই একমাত্র উত্তর যা সমস্যাটি সত্যিই সমাধান করে।
একাকী দিন

2
@ এমনিটেক: কী ... আপনি জাভাস্ক্রিপ্টের funcitonকীওয়ার্ডের সাথে পরিচিত নন ? ;) সম্পাদনা করার জন্য ধন্যবাদ

1
@ জিডোরন: আমি কেবল একটি মন্তব্য যুক্ত করেছি। আমি এই মুহূর্তে সত্যিই বিভ্রান্ত না হলে আমি এমন কোনও ব্রাউজারকে জানি না যা কোনও আসল আর্গুমেন্ট অবজেক্টকে দ্বিতীয় আর্গ হিসাবে গ্রহণ করবে না .apply()। তবে এটি উদাহরণস্বরূপ jQuery অবজেক্টের মতো যদি অ্যারের মতো অবজেক্ট হয় তবে হ্যাঁ, কিছু ব্রাউজারগুলি একটি ত্রুটি ছুঁড়ে

2
এই উত্তরটি যেমন হয়, ততক্ষণে ইউটিউব আইফ্রেম এপিআইয়ের মাধ্যমে এম্বেড করা পৃথক ইউটিউব ভিডিওগুলি নিয়ন্ত্রণ করতে উদাহরণস্বরূপ অবজেক্টগুলি ব্যবহার করার সমস্যাটি সমাধান করে। আপনার ধারণা নেই যে আমি যখন থেকে প্রতিটি ভিডিওর ডেটা অনন্য মডুলার উপায়ে হ্যান্ডেল করার জন্য একটি ক্লাস তৈরি করার চেষ্টা করছি তখন এপিআই-র একক বিশ্বব্যাপী ফাংশন হওয়ার দরকার রয়েছে এই বিষয়টি নিয়ে আপনি কতক্ষণ চেষ্টা করছেন। আপনি দিনের জন্য আমার নায়ক।
কর্নিক্স

31

প্রথমে আসল ফাংশনটি একটি ভেরিয়েবলে সঞ্চয় করুন ..

var oldFunction = someFunction;

তারপরে আপনার নিজের সংজ্ঞা দিন:

someFunction = function(){
  // do something before
  oldFunction();
  // do something after
};

9
আপনার ফাংশনটি যদি কোনও পদ্ধতি হয় তবে আপনাকে applyএটি কল করার জন্য প্রয়োজন । আমি এর উত্তর দেখুন।
hugomg

এটি আমার পক্ষে কাজ করেছে, তবে উপরের কোডটি someFunctionদিয়ে প্রতিস্থাপন করা দরকার window.someFunction। কারণটি হ'ল আমার ফাংশনটি একটি জ্যাকারি $(document).ready()হ্যান্ডলারের ভিতরে ঘোষণা করা হয়েছিল ।
নেলসন

10

আপনি এমন একটি ফাংশন তৈরি করতে পারেন যা আপনার কোডকে কল করে এবং তারপরে ফাংশনটি কল করে।

var old_someFunction = someFunction;
someFunction = function(){
    alert('Hello');
    old_someFunction();
    alert('Goodbye');
}

6

আপনি ফাংশনটি আপডেট করতে পারবেন কিনা তা আমি জানি না তবে এটি কীভাবে রেফারেন্স করা হয়েছে তার উপর নির্ভর করে আপনি তার জায়গায় একটি নতুন ফাংশন তৈরি করতে পারেন:

var the_old_function = someFunction;
someFunction = function () {
    /* ..My new code... */
    the_old_function();
    /* ..More of my new code.. */
}

5

এছাড়াও। আপনি যদি স্থানীয় প্রসঙ্গ পরিবর্তন করতে চান তবে আপনাকে ফাংশনটি পুনরায় তৈরি করতে হবে। উদাহরণ স্বরূপ:

var t = function() {
    var a = 1;
};

var z = function() {
    console.log(a);
};

এখন

z() // => log: undefined

তারপর

var ts = t.toString(),
    zs = z.toString();

ts = ts.slice(ts.indexOf("{") + 1, ts.lastIndexOf("}"));
zs = zs.slice(zs.indexOf("{") + 1, zs.lastIndexOf("}"));

var z = new Function(ts + "\n" + zs);

এবং

z() // => log: 1

তবে এটি কেবল সহজ উদাহরণ। যুক্তি, মন্তব্য এবং প্রত্যাবর্তনের মান হ্যান্ডেল করতে এখনও অনেক বেশি কাজ লাগবে। এছাড়াও, এখনও অনেক সমস্যা রয়েছে pit
টুস্ট্রিং | টুকরো | indexOf | lastIndexOf | নতুন ফাংশন


1

প্রক্সি প্যাটার্ন (ব্যবহারকারীর দ্বারা ব্যবহৃত 106925) কোনও ফাংশনের ভিতরে রাখা যেতে পারে। আমি নীচে যেটি লিখেছি সেগুলি ফাংশনগুলিতে কাজ করে যা বিশ্বব্যাপী সুযোগে নেই, এমনকি প্রোটোটাইপগুলিতেও। আপনি এটি এর মতো ব্যবহার করবেন:

extender(
  objectContainingFunction,
  nameOfFunctionToExtend,
  parameterlessFunctionOfCodeToPrepend,
  parameterlessFunctionOfCodeToAppend
)

নীচের স্নিপেটে, আপনি আমাকে টেস্ট.প্রোটোটাইপ.ড.আইটি () প্রসারিত করতে ফাংশনটি ব্যবহার করতে দেখতে পারেন।

// allows you to prepend or append code to an existing function
function extender (container, funcName, prepend, append) {

    (function() {

        let proxied = container[funcName];

        container[funcName] = function() {
            if (prepend) prepend.apply( this );
            let result = proxied.apply( this, arguments );
            if (append) append.apply( this );
            return result;
        };

    })();

}

// class we're going to want to test our extender on
class test {
    constructor() {
        this.x = 'instance val';
    }
    doIt (message) {
        console.log(`logged: ${message}`);
        return `returned: ${message}`;
    }
}

// extends test.prototype.doIt()
// (you could also just extend the instance below if desired)
extender(
    test.prototype, 
    'doIt', 
    function () { console.log(`prepended: ${this.x}`) },
    function () { console.log(`appended: ${this.x}`) }
);

// See if the prepended and appended code runs
let tval = new test().doIt('log this');
console.log(tval);

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