سؤال

لقد صنعت مؤخرًا مكتبة JavaScript الخاصة بي واستخدمت في البداية النمط التالي:

var myLibrary = (function () {

  var someProp = "...";

  function someFunc() {
    ...
  }

  function someFunc2() {
    ...
  }

  return {
     func: someFunc,
     fun2: someFunc2,
     prop: someProp;
  }

}());

المشكلة في ذلك هي أنه لا يمكنني استخدام إكمال التعليمات البرمجية حقًا لأن IDE لا يعرف عن الخصائص التي تعودها الوظيفة الحرفية (أنا أستخدم IDEA 9 بالمناسبة).

لقد نظرت إلى رمز jQuery وحاولت القيام بذلك:

(function(window, undefined) {
    var myLibrary = (function () {

      var someProp = "...";

      function someFunc() {
        ...
      }

      function someFunc2() {
        ...
      }

      return {
         func: someFunc,
         fun2: someFunc2,
         prop: someProp;
      }

    }());

    window.myLibrary = myLibrary;
}(window));

حاولت هذا ، لكن الآن لدي مشكلة مختلفة. لا تلتقط IDE حقًا myLibrary أيضاً.

الطريقة التي أحل بها المشكلة الآن هي بهذه الطريقة:

var myLibrary = {
   func: function() { },
   func2: function() { },
   prop: ""
};

myLibrary = (function () {

  var someProp = "...";

  function someFunc() {
    ...
  }

  function someFunc2() {
    ...
  }

  return {
     func: someFunc,
     fun2: someFunc2,
     prop: someProp;
  }

}());

لكن هذا يبدو نوعًا ما ، ولا يمكنني معرفة كيفية قيام jQuery بذلك. سؤال آخر لدي هو كيفية التعامل مع الوظائف بأرقام تعسفية من المعلمات.

علي سبيل المثال، jQuery.bind يمكن أن تأخذ 2 أو 3 معلمات ، ويبدو أن IDE لا تشكو. حاولت أن أفعل الشيء نفسه مع مكتبتي ، حيث يمكن أن تأخذ الوظيفة 0 وسيطات أو وسيطة واحدة. ومع ذلك ، فإن IDE يشكو ويحذر من أنه لا يتم إرسال العدد الصحيح من المعلمات. كيف يمكنني التعامل مع هذا؟

تعديل

بدأت أتساءل عما إذا كانت هذه مشكلة Idea9 لأن JQuery لديه نفس المشكلة. لا يبدو أن لدي هذه المشكلة في مشاريع أخرى.

هل كانت مفيدة؟

المحلول

أنا أستخدم Idea مع نمط وحدة Yahoo وأعمال الإكمال التلقائي. Google لنمط وحدة Yahoo.

http://www.yuiblog.com/blog/2007/06/12/module-patern/

http://ajaxian.com/archives/a-javascript-module-pattern


TEST = function() {
    var SOME_CONSTANT='asd';

    function privateStuff(){
        var a = 'asd';
        return a;
    }

    return{
        someArray:[],

        someMethod: function(foo, bar){

            var foo = *1
        }
        ,

        myProperty:'test'
    }
}();

TEST.*2

مع *1 و *2 ، حددت الأماكن التي حاولت فيها اكتمال تلقائي.

في *1 ، أحصل على بعض طريقة _constant و privatestuff ، وإذا وضعت هذا. (الإكمال التلقائي) أحصل على جميع الأساليب والخصائص الموجودة داخل الإرجاع {}

عندما أحاول الإكمال التلقائي على *2 ، أحصل على جميع الأساليب والخصائص الداخلية للعودة {}. هناك طريقة some_constant و privatestuff هناك ، لأنها "خاصة".

بالنسبة لي هذا المستوى من الإكمال التلقائي جيد جدًا.

نصائح أخرى

أعتقد أنه سيكون رائعًا إذا قرأت شيئًا عن دوغلاس كروكفورد. وهو المهندس المعماري في إطار ياهو يوي. وبعد ذلك يمكنك أن يكون لديك فكرة أفضل لكيفية بناء إطار رائع. وبالنسبة للمعلمة هناك خياران. 1.- أرسل عبر مثال كائن

{ option :{ var1 : "value" , var2:"value"}, var3 : "value" }

ويمكنك التحقق مما إذا كان الخيار موجودًا.

والثاني ليس العظيم هو التحقق مما إذا كانت المعلمة غير محددة.

function foo(var1,var2){
   var var1_this = null;
     if(var1 != undefined)
      var1_this = var1;
}

ومجرد تعليق لماذا بناء إطار عمل جافا سكريبت جديد؟ استخدم النموذج الأولي ، jQuery ، Mootols ، Yui. لماذا إعادة اختراع العجلة؟

هذا في الرد على التعليقات منشور Mwilcox.

هذا المثال سوف يعمل بالفعل. حيث myLibrary تم تعريفه بدون var, ، يتم وضعها تلقائيًا في مساحة الاسم العالمية ويمكن الوصول إليها على هذا النحو. من خلال الإغلاق الذي أنشأته وظيفة التنفيذ الذاتي ، لا تزال المتغيرات والأساليب الخاصة متاحة في myLibrary أساليب. يمكنك بسهولة تجربة ذلك عن طريق وضعه في Firebug أو Rhino.

في هذه الأيام ، لا أميل إلى إخفاء متغيراتي ، أي أني استخدم النمط الكلاسيكي الكاذب أو النمط النموذجي والبادئة منوي طرق خاصة مع _:

// Pseudoclassical pattern
function Hello() {}
Hello.prototype = {
    method1: function() {},
    method2: function() {},
    _pseudeoPrivate: function() {}
};

/* Prototypal pattern. To create multiple instances of this object,
   you need a helper function such as
    function beget(o) {
        var F = function() {};
        F.prototype = o;
        return new F;
    }
    var instance = beget(world);
*/
var world = {
    method1: function() {},
    method2: function() {}
};

لمنع رمزتي من تلويث مساحة الاسم العالمية ، لدي عملية بناء تلتف وحداتي في إغلاق وتصدر واجهة برمجة التطبيقات العامة إلى مساحة الاسم. هذه التقنية تستخدم أيضا من قبل jQuery. يمكنك أن ترى ذلك في رمز المصدر (انظر إلى intro.js & outro.js) جيثب.

هذا من شأنه أن يتيح لك استخدام نمط يسمح لـ IDE (أو CTAGs مع VIM) برؤية واجهة برمجة التطبيقات الخاصة بك ، مع منع أيضًا تلوث مساحة الاسم العالمية.

أكتب مكتباتي مثل هذا:

function MyLibrary() {
    // code
}
MyLibrary.prototype.memberFunc = function() {
    // code
}
MyLibrary.prototype.memberVar = 5;

new MyLibrary();

بهذه الطريقة ، في جيني (الذي يستخدم CTAGS) MyLibrary معترف به جيدًا (بالنسبة للجزء الأكبر ، على سبيل المثال ، يتم التعرف على MemberVar كدالة) ويبدو أن الإكمال التلقائي يعمل. لا أعرف عن Idea9 ، لكن يمكنك تجربتها بهذه الطريقة (لديّ حدس أكثر تطوراً من CTAGs).

أوصي بأن لا تستخدم المتغيرات الخاصة ، لكني أفهم أنك تريد إخفائها من Intellisense. هكذا سأفعل ذلك:

(function(){
    var privateVar = "shhhh!";
    var privateMethod = function(){}


    myLibray = {
        prop:42,
        foo: function(){
            return privateMethod()
        },
        bar: function(){
            return privateVar;
        }
    }

})();

وبهذه الطريقة ، يمكنك الحصول على أغراضك الخاصة في إغلاق ويجب أن تكون مكتبتك متاحة.

تحرير. لم أكن أدرج MyLibrary في الوظيفة المجهولة ولم أتمكن من رؤية Vars الخاص. وجه الفتاة.

راجع للشغل ، أسباب أن المتغيرات الخاصة سيئة: http://clubajax.org/javascript-private-variables-are-evil/

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top