मेरे सिस्टम में, मेरे पास कई "कक्षाएं" हैं जो ब्राउज़र में भरी हुई हैं, प्रत्येक विकास के दौरान एक अलग फाइल, और उत्पादन के लिए एक साथ मिलाई गई हैं। जैसा कि वे लोड किए गए हैं, वे एक वैश्विक वस्तु पर एक संपत्ति को इनिशियलाइज़ करते हैं, यहाँ G
, इस उदाहरण में:
var G = {};
G.Employee = function(name) {
this.name = name;
this.company = new G.Company(name + "'s own company");
};
G.Company = function(name) {
this.name = name;
this.employees = [];
};
G.Company.prototype.addEmployee = function(name) {
var employee = new G.Employee(name);
this.employees.push(employee);
employee.company = this;
};
var john = new G.Employee("John");
var bigCorp = new G.Company("Big Corp");
bigCorp.addEmployee("Mary");
अपने स्वयं के वैश्विक ऑब्जेक्ट का उपयोग करने के बजाय, मैं जेम्स बर्क के सुझाव के आधार पर प्रत्येक वर्ग को अपना एएमडी मॉड्यूल बनाने पर विचार कर रहा हूं :
define("Employee", ["Company"], function(Company) {
return function (name) {
this.name = name;
this.company = new Company(name + "'s own company");
};
});
define("Company", ["Employee"], function(Employee) {
function Company(name) {
this.name = name;
this.employees = [];
};
Company.prototype.addEmployee = function(name) {
var employee = new Employee(name);
this.employees.push(employee);
employee.company = this;
};
return Company;
});
define("main", ["Employee", "Company"], function (Employee, Company) {
var john = new Employee("John");
var bigCorp = new Company("Big Corp");
bigCorp.addEmployee("Mary");
});
मुद्दा यह है कि पहले, कर्मचारी और कंपनी के बीच कोई घोषित समय-निर्भरता नहीं थी: आप घोषणा को उस क्रम में रख सकते थे जो आप चाहते थे, लेकिन अब, आवश्यकता के अनुसार, यह एक निर्भरता का परिचय देता है, जो यहां (जानबूझकर) परिपत्र है, इसलिए उपरोक्त कोड विफल रहता है। बेशक, addEmployee()
पहली पंक्ति var Employee = require("Employee");
को जोड़ने से यह काम कर जाएगा , लेकिन मैं इस समाधान को आवश्यकता के रूप में नहीं देख रहा हूं आवश्यकता अनुसार / एएमडी का उपयोग नहीं करने के लिए क्योंकि मुझे इसकी आवश्यकता है, डेवलपर, इस नव निर्मित परिपत्र निर्भरता के बारे में पता होना और इसके बारे में कुछ करना।
क्या इस समस्या का समाधान करने के लिए एक बेहतर तरीका है आवश्यकता / एएमडी, या क्या मैं कुछ के लिए आवश्यकता / एज़ेडजेएस का उपयोग कर रहा हूं जो इसके लिए डिज़ाइन नहीं किया गया था?
function(exports, Company)
और दोनों में निर्यात की घोषणा करनी होगीfunction(exports, Employee)
। वैसे भी, आवश्यकता के लिए धन्यवाद, यह एक महत्वपूर्ण है।