سؤال

بعد القيام ببعض القراءة حول نمط الوحدة النمطية ، رأيت بعض الطرق لإعادة الخصائص التي تريد أن تكون علنيًا.

تتمثل إحدى الطرق الأكثر شيوعًا في إعلان خصائصك وأساليبك العامة داخل بيان "العودة" مباشرةً ، بصرف النظر عن خصائصك وطرقك الخاصة. هناك طريقة مماثلة (نمط "الكشف") تتمثل في توفير إشارات ببساطة إلى الخصائص والأساليب التي تريد أن تكون علنيًا. أخيرًا ، كانت التقنية الثالثة التي رأيتها هي إنشاء كائن جديد داخل وظيفة الوحدة النمطية ، والتي تقوم بتعيين خصائصك الجديدة قبل إرجاع الكائن المذكور. كانت هذه فكرة مثيرة للاهتمام ، ولكنها تتطلب إنشاء كائن جديد.

لذلك كنت أفكر ، لماذا لا تستخدم فقط this.propertyName لتعيين خصائصك وطرقك العامة ، واستخدم أخيرًا return this في نهايةالمطاف؟ بهذه الطريقة تبدو أبسط بكثير بالنسبة لي ، حيث يمكنك إنشاء خصائص وطرق خاصة مع المعتاد var أو function بناء الجملة ، أو استخدم this.propertyName بناء جملة لإعلان أساليبك العامة.

ها هي الطريقة التي أقترحها:

(function() {

var privateMethod = function () {
    alert('This is a private method.');
}

this.publicMethod = function () {
    alert('This is a public method.');
}

return this;

})();

هل هناك أي إيجابيات/سلبيات لاستخدام الطريقة أعلاه؟ ماذا عن الآخرين؟

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

المحلول

وظيفتك لا تحتوي على سياق كائن ، لذلك this الإشارات إلى العالم window كائن في هذه الحالة. كل خاصية تقوم بتعيينها this تلوث تلقائيا مساحة الاسم العالمية.

(function() {
    console.log(this == window); // true

    this.publicMethod = function () {
        alert('This is a public method.');
    }

})();

console.log(publicMethod); // function()

يمكنك تمريره بشكل صريح ككائن لمعرفة السياق الذي يجب استخدامه.

var MYAPP = {};

(function() {
    // 'this' will now refer to 'MYAPP'
    this.publicMethod = function () {
        alert('This is a public method.');
    }
}).call(MYAPP);

console.log(publicMethod); // undefined
console.log(MYAPP.publichMethod); // function()

الذي يمكنك كتابته بأسلوب آخر إلى حد ما:

var MYAPP = (function(my) {
    var my;
    ⋮
    return my;
})(MYAPP);

ووصلنا إلى نمط تمت مناقشته بالفعل. لمزيد من التفاصيل ، راجع مقالة داستن تحديد الوظائف المجهولة.

نصائح أخرى

أود أن أوصي بالأسلوب الذي تضيف فيه خصائصك وأساليبك العامة إلى كائن مجهول بعد ذلك بعد ذلك:

var myModule = (function() {
    function privateMethod() { ... }
    function publicMethod() { ... }

    return { publicMethod: publicMethod };
})();

إذا كنت ترغب في نشر طرق ، فافعل شيئًا مثل:

var export = (function() {

var privateMethod = function () {
  alert('This is a private method.');
}
var export = {};

export.publicMethod = function () {
  alert('This is a public method.');
}

return export;

})();

خيار آخر هو تجنب هذه الإشارة تماما. حدد وظيفة تنشئ وترجع كائنًا مجهولًا بدلاً من ذلك.

function makeThing(someAttribute) {
  var privateVariable = 42;

  function someMethod() {
    return privateVariable;
  }

  return {
    "publicMethodName": someMethod,
    "getAttribute": function() {
      return someAttribute;
    }
  };
}

var thing = makeThing(99);
thing.publicMethodName();
thing.getAttribute();

أنماط الوحدة النمطية:

var m1 = (function(){ return {method: mthod} })();
var m2 = new function Singleton(){ return {method: mthod} };
var m3 = ({}).prototype = {method: method};
var m4 = ({}).prototype = (function(){ ... })();
var m5 = (function(){}).prototype = {} || (function(){ ... })();

var m6 = (function(extendee){
    return extendee.prototype = {attr3: 'attr3'};
})({currentAttr1: 1, currentAttr2: 2});

أيضًا ، إذا كنت بحاجة إلى تخصيص طريقة:

var m = (function(){}).prototype = (function(){
    var thus = m;  // this
    console.log('m this-------', thus);

    function fn(){
        console.log('fn', thus);
        return thus;
    }
    function f(){
        console.log('f', thus);
        return 'poop';
    }

    return {f: f, fn: fn};
})();

console.log('M:', m, 'm.fn', m.fn(), 'm.fn.f', m.fn().f());

هناك أيضًا الكثير من الطرق ، ويمكنك أيضًا تهيئة وحداتك أيضًا.

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