extjs 3: طريقتان لإنشاء فئة مخصصة: ما الفرق؟
-
29-09-2019 - |
سؤال
أحاول تعلم extjs وجافا سكريبت الموجهة نحو الكائن بشكل عام. لقد رأيت أشخاصًا يحددون الفصول الدراسية في مساحات أسماء مخصصة بطريقتين. ما الفرق بين هاتين الطريقتين؟
طريقة 1
Ext.ns('myapp.cars');
(function(){
var Car = Ext.extend(Object, {
//...
})
myapp.cars.Car = Car;
})()
الطريقة 2
Ext.ns('myapp.cars');
myapp.cars.Car = Ext.extend(Object, {
//...
});
الطريقة 2 أسهل في القراءة وتتطلب رمزًا أقل ؛ هل هناك أي سبب من الأسباب 1؟ شكرًا!
المحلول
إنه نفس الشيء ، باستثناء أنه يمكنك استخدام المتغيرات الخاصة في الوظيفة المنتكجية ذاتية للطريقة الأولى ، بينما يمكنك فقط تحديد المتغيرات العالمية في السلطة الثانية.
فمثلا:
Ext.ns('myapp.cars');
(function(){
var carInfo = {
goodEngine: true
};
var Car = Ext.extend(Object, {
info: carInfo
});
myapp.cars.Car = Car;
})()
// carInfo is undefined here, so this will give an error
alert( carInfo.goodEngine );
لذا ، فإن الطريقة الأولى مفيدة للغاية إذا كنت تعمل مع مجموعة من المتغيرات التي لن تستخدمها لاحقًا.
نصائح أخرى
فيما يلي معادلة عملياً:
var Car = Ext.extend(Object, {
//...
});
myapp.cars.Car = Car;
... و:
myapp.cars.Car = Ext.extend(Object, {
//...
});
في المثال الأول ، كنت تستخدم متغيرًا مؤقتًا للاحتفاظ بمرجع إلى الكائن الذي تم إنشاؤه حديثًا ، والذي يتم نسخه بعد ذلك myapp.cars.Car
(يتم نسخ المرجع ، وليس الكائن). في المثال الثاني ، ستقوم بتعيين المرجع إلى الكائن مباشرة إليه myapp.cars.Car
.
السبب في أن مثالك الأول كان محاطًا بالوظيفة المجهولة للذات (function(){ })()
هو الحد من نطاق هذا المتغير المؤقت. يتم ذلك بشكل عام حتى لا يلوث مساحة الاسم العالمية مع ذلك Car
عامل. إذا كان هناك الآخر Car
متغير محدد في مكان آخر ، لن يتعارض مع هذا. مثال:
var Car = "My Nice Car";
(function(){
var Car = Ext.extend(Object, {
//...
});
myapp.cars.Car = Car;
})();
alert(Car); // Still "My Nice Car"
// No conflict with the `Car` variable in the self invoking function.