यदि मॉड्यूल में फ़ंक्शन मॉड्यूल के अन्य फ़ंक्शंस को सीधे कॉल करते हैं (यानी मॉड्यूल के लिए स्थानीय संदर्भों का उपयोग करके), इन कॉल को बाहरी रूप से अवरुद्ध करने का कोई तरीका नहीं है। हालांकि, अगर आप अपने मॉड्यूल को बदलते हैं ताकि कार्यों अंदर यह मॉड्यूल के कार्यों उसी तरह कोड में फोन बाहर यह करता है, तो आप इन कॉल को रोक सकता।
define([], function() {
"use strict";
var foo = function(){
return exports.bar();
};
var bar = function(){
return "original";
};
var exports = {
foo: foo,
bar: bar
};
return exports;
});
कुंजी है कि foo
bar
का उपयोग करने के बजाय इसे सीधे कॉल करने के लिए exports
माध्यम से चला जाता:
यहाँ एक उदाहरण है कि अनुमति होगी तुम क्या चाहते हो।
मैं एक runnable उदाहरण here ऊपर डाल दिया। spec/main.spec.js
फ़ाइल है:
expect(moduleA.foo()).toEqual("original");
spyOn(moduleA, "bar").andReturn("patched");
expect(moduleA.foo()).toEqual("patched");
आप देखेंगे कि bar
समारोह समझौता है, लेकिन foo
पैचिंग से प्रभावित है।
इसके अलावा, स्थायी आधार पर परीक्षण कोड द्वारा प्रदूषित निर्यात से बचने के लिए, मैंने कभी-कभी यह जांचने के लिए पर्यावरण जांच की है कि मॉड्यूल परीक्षण वातावरण में चलाया गया है और केवल परीक्षण के लिए आवश्यक कार्यों को निर्यात करेगा परीक्षण मोड
var options = module.config();
var test = options && options.test;
[...]
// For testing only
if (test) {
exports.__test = {
$modal: $modal,
reset: _reset,
is_terminating: _is_terminating
};
}
requirejs विन्यास कॉन्फ़िगर करता है तो मेरी मॉड्यूल (config
का प्रयोग करके) इतना है कि यह एक test
विकल्प के लिए एक सही मूल्य पर सेट है तो निर्यात इसके अलावा एक __test
प्रतीक शामिल होंगे: यहाँ वास्तविक कोड का एक उदाहरण मैं लिखा है है जिसमें कुछ अतिरिक्त आइटम शामिल हैं जिन्हें मैं निर्यात करना चाहता हूं जब मैं मॉड्यूल का परीक्षण कर रहा हूं। अन्यथा, ये प्रतीक उपलब्ध नहीं हैं।
संपादित करें: यदि क्या पहली विधि ऊपर exports
के साथ आंतरिक कार्यों के लिए सभी कॉल्स उपसर्ग के लिए चल रहा है के बारे में आपको परेशान करती है, तो आप कुछ इस तरह कर सकता है:
define(["module"], function (module) {
"use strict";
var debug = module.config().debug;
var exports = {};
/**
* @function
* @param {String} name Name of the function to export
* @param {Function} f Function to export.
* @returns {Function} A wrapper for <code>f</code>, or <code>f</code>.
*/
var _dynamic = (debug ?
function (name, f) {
exports[name] = f;
return function() {
// This call allows for future changes to arguments passed..
return exports[name].apply(this, arguments);
};
} :
_dynamic = function (name, f) { return f; });
var foo = function() {
return bar(1, 2, 3);
};
var bar = _dynamic("bar", function (a, b, c) {
return "original: called with " + a + " " + b + " " + c;
});
exports.foo = foo;
return exports;
});
RequireJS विन्यास मॉड्यूल कॉन्फ़िगर करता है जब ऊपर debug
सत्य है, यह _dynamic
और द्वारा लिपटे कार्यों को निर्यात करता है जो स्थानीय प्रतीकों को प्रदान करता है जो उन्हें exports
के बिना बिना संदर्भित करने की अनुमति देता है। यदि debug
गलत है, तो फ़ंक्शन निर्यात नहीं किया गया है और लपेटा नहीं गया है। इस विधि को दिखाने के लिए मैंने example अपडेट किया है। उदाहरण में यह moduleB
है।
अरे, यह काम करने योग्य है, लेकिन कुछ हद तक परेशान है क्योंकि आपको मानचित्र के नाम से प्रत्येक विधि कॉल को उपसर्ग करना है। मैं कुछ दिनों के लिए अन्य सुझावों की प्रतीक्षा करूंगा :) – GEMI
@GEMI मैंने अपना उत्तर किसी अन्य विधि से अपडेट किया है।इसके अलावा, केवल एक चीज जो दिमाग में आती है: हैं: अपनी जावास्क्रिप्ट को उपकरण जोड़ने के लिए प्रीप्रोसेस करें, या बंद करने के माध्यम से पंच करने के लिए अयोग्य वीएम हुक का उपयोग करें। – Louis
अगर मैं इसे पहले पढ़ता हूं। मेरे सिर को कुचलने के लिए साइनऑन के साथ एक समारोह को रोकने के लिए बंद करने के माध्यम से कैसे प्राप्त किया गया था। महोदय, आपने मुझे बहुत समय बचाया! – dvcrn