نمط وحدة JavaScript - ماذا عن استخدام "إرجاع هذا"؟
-
01-10-2019 - |
سؤال
بعد القيام ببعض القراءة حول نمط الوحدة النمطية ، رأيت بعض الطرق لإعادة الخصائص التي تريد أن تكون علنيًا.
تتمثل إحدى الطرق الأكثر شيوعًا في إعلان خصائصك وأساليبك العامة داخل بيان "العودة" مباشرةً ، بصرف النظر عن خصائصك وطرقك الخاصة. هناك طريقة مماثلة (نمط "الكشف") تتمثل في توفير إشارات ببساطة إلى الخصائص والأساليب التي تريد أن تكون علنيًا. أخيرًا ، كانت التقنية الثالثة التي رأيتها هي إنشاء كائن جديد داخل وظيفة الوحدة النمطية ، والتي تقوم بتعيين خصائصك الجديدة قبل إرجاع الكائن المذكور. كانت هذه فكرة مثيرة للاهتمام ، ولكنها تتطلب إنشاء كائن جديد.
لذلك كنت أفكر ، لماذا لا تستخدم فقط 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());
هناك أيضًا الكثير من الطرق ، ويمكنك أيضًا تهيئة وحداتك أيضًا.