2012-04-25 7 views
7

इतिहास का पहला इतिहास, हमारे पास एक इंजन है जो कई जावास्क्रिप्ट फ़ाइलों से बना है जो अनिवार्य रूप से मॉड्यूल हैं। ये मॉड्यूल वैश्विक स्तर पर असाइन किए गए एक वर्ग को लौटाते हैं, हालांकि निर्दिष्ट नामस्थान के तहत।एएमडी के साथ परिभाषित जावास्क्रिप्ट मॉड्यूल कैसे बढ़ाया जा सकता है?

इंजन का उपयोग ई-लर्निंग सामग्री को प्रदर्शित करने के लिए किया जाता है, प्रत्येक अलग-अलग ई-लर्निंग कोर्स के साथ थोड़ा अलग ज़रूरत होती है, जहां हम आवश्यक कार्यक्षमता के आधार पर पृष्ठ में जावास्क्रिप्ट फ़ाइलों को शामिल करते हैं। (केवल एक प्रविष्टि पृष्ठ है)।

अगर मैं एएमडी, require.js और r.js में बदलना लायक हूं या हमारे वर्तमान सिस्टम के साथ रहना बेहतर है, तो पेज पर आवश्यक सब कुछ शामिल है और इसे एक स्क्रिप्ट में कम करता है।

एएमडी जाने के साथ मेरी सबसे बड़ी समस्याओं में से एक यह होगा कि कक्षा आसानी से विस्तार करना मुश्किल लगता है। उदाहरण के लिए, कभी-कभी हमें मूल वर्ग के व्यवहार को थोड़ा समायोजित करना होता है। इसलिए हम उस पृष्ठ पर एक और स्क्रिप्ट जोड़ते हैं जो मूल प्रोटोटाइप की प्रतिलिपि बनाकर मूल वर्ग को बढ़ाता है, मूल फ़ंक्शन निष्पादित करता है जिसे लागू करने के साथ ओवरराइड किया जा रहा है और फिर जो अतिरिक्त कोड आवश्यक है, उसे करें।

क्या आप मूल फ़ाइल को अनुकूलित किए बिना एएमडी मॉड्यूल का विस्तार कर सकते हैं? या क्या मैं इस बिंदु को याद कर रहा हूं और हम इस समय क्या कर रहे हैं उसके साथ हम सबसे अच्छे रह रहे हैं?

उत्तर

6

मैं हाल ही में RequireJS का उपयोग कर एक परियोजना शुरू की है, और विधि मैं अंडरस्कोर का विस्तार करने के लिए उपयोग कुछ इस तरह करने पर निर्भर करता:

प्रासंगिक निर्देशिका संरचना:

  • /स्क्रिप्ट
  • /scripts/underscore.js
  • /scripts/base/underscore.js

असली अंडरस्कोर पुस्तकालय /scripts/base/underscore.js को जाता है।

मेरे एक्सटेंशन /scripts/underscore.js में जाते हैं।

/scripts/underscore.js में कोड इस तरह दिखता है: अंडरस्कोर पर

define(['underscore', './base/SomeClass'], function (_, SomeClass) { 
    'use strict'; 

    _.extend(SomeClass.prototype, { 
     someMethod: function (someValue) { 
      return this.somethingOrOther(someValue * 5); 
     } 
    }); 

    return SomeClass; 
}); 

नोट::

define(['./base/underscore'], function (_) { 
    'use strict'; 

    var exports = {}; 

    // add new underscore methods to exports 

    _.mixin(exports); // underscore's method for adding methods to itself 

    return _; // return the same object as returned from the underscore module 
}); 

एक सामान्य एक्सटेंशन के लिए, इसे और अधिक ऐसा दिखाई दे सकता कहीं और मैंने एएमडी मॉड्यूल के रूप में लोड करने के लिए अंडरस्कोर प्राप्त करने के लिए RequJS shim-config का उपयोग किया, लेकिन इस प्रक्रिया पर गैर-shimmed AMD मॉड्यूल के साथ इसका कोई प्रभाव नहीं होना चाहिए।

0

आपके पास ऐसे मॉड्यूल हो सकते हैं जिनमें आपके कंस्ट्रक्टर फ़ंक्शन शामिल हों। जब ये मॉड्यूल शामिल होते हैं, तो वे उपयोग के लिए तैयार होते हैं। तो आप बाद में उनमें से वस्तुओं को बना सकते हैं। में

उदाहरण की आवश्यकता होती है:

//construction.js 
define(function(){ 

    //expose a constructor function 
    return function(){ 
     this.... 
    } 
}); 

//then in foo.js 
define([construction],function(Construction){ 
    var newObj = new Construction; //one object using constructor 
}); 

//then in bar.js 
define([construction],function(Construction){ 

    //play with Construction's prototype here then use it 

    var newObj = new Construction; 
}); 
+0

हाय जोसेफ, आपकी प्रतिक्रिया के लिए धन्यवाद लेकिन यह सवाल नहीं है कि मैं पूछ रहा था। आप मूल निर्माता के उदाहरण बना रहे हैं।मैं 'इंजन' कहने की परिभाषा चाहता हूं, जिसका उपयोग किसी अन्य आइटम की परिभाषा में किया जाता है, आइए 'कंटेंटस्क्रीन' कहें। हालांकि 'इंजन' की परिभाषा और 'सामग्रीस्क्रीन' के निर्माण के बीच मैं थोड़ा 'इंजन' का विस्तार करना चाहता हूं। –

+0

@John_ आप "थोड़ा विस्तार" से क्या मतलब है? एक संशोधित कन्स्ट्रक्टर का निर्माण और फिर उस संशोधित कन्स्ट्रक्टर का उपयोग करें? [यह मदद कर सकता है] (http://stackoverflow.com/a/10101604/575527) – Joseph

+0

अनिवार्य रूप से हां, मैं मूल रूप से विस्तारित एक नई कक्षा नहीं बनाना चाहता, मैं वास्तव में मूल का विस्तार करना चाहता हूं और इसका उपयोग करना चाहता हूं, क्योंकि जहां तक ​​बाकी सब कुछ चिंतित है, यह अभी भी एक ही कक्षा है। जहां तक ​​मैं कह सकता हूं कि मैं एएमडी के साथ ऐसा नहीं कर सकता? –

संबंधित मुद्दे

 संबंधित मुद्दे