تفاوت declare.safeMixin و lang.mixin  در dojo

حتما  هنگام  بازبینی  یک   کد نوشته شده با  DOJO   به همچین چیزی  برخورد کرده اید,  declare.safeMixin  و  lang.mixin.

که  بیشتر  در  هنگام تعریف کلاس  در   دوجو استفاده میگردد. اگر  با  تعریف کردن  کلاس  در  Dojo   اشنا نیستین  بهتره   این  پست       رو ببینین.

خوب  بهتره  اول  کمی  با lang.mixin  آشنا بشیم 

require(["dojo/_base/lang"], function(lang){
  var X = { b: "c", d: "e" };
  var Y ={ d: "f", g: "h" }
  lang.mixin(X, Y);
  console.log(X); // b: c, d: f, g: h
});

میبینیم  که  این  function     داخل  ماژول    "dojo/_base/lang"     تعریف  شده .کار  این  function     اینه که   دو تا  آبجک  رو  با هم  Merg  میکنه..به مثال  دقت کنین..

  دو تا شئ  یا  object   داریم.. X  و Y .به  نحوه  تعریف  کلاس  ها هم توجه کنین..از declare    استفاده نکردیم...خیلی  ساده تعریف  شدن.

 X   داری  پراپرتی های   b   و  d  .    و  شئ  Y   داری پراپرتی  های   d ,  g  .  دقت کنین  که  هر دو  دارای  پراپرتی  d  هستن. اما   بعد  از  Mixin   یا  merg   کردن  به خروجی  که چاپ شده دقت کنین.

آبجکت X   رو  چاپ  کرده  که  برای  پراپرتی d  مقدار  f   رو  چاپ کرده.   اما  در ـعریف  شئ  X    برای d  مقدار  e   تنظیم شده بود.

میبینیم که  lang.mixin  پراپرتی های  آبجکت سمت  چپ  یا  همون  شئ دوم  رو  به  آبجکت اول  اضافه میکنه  و  اگر  پراپرتی هم نامی  هم وجود داشته باشه  به  اصلاح override   میشه.

 حالا  به مثال  زیر  توجه کنین  که  lang.mixin  و   declare.safeMixin      رو با هم مقایسه  کرده ایم

 



require(["dojo/_base/declare","dojo/_base/lang"],function (declare,lang){
var Person = declare(null, {
  name: null,
  message: "foo",
  constructor: function(args) {
    this.name = args.name;
  },
  speak: function() {
    console.log( "result  is  =  "+ this.message );
  }
});


var rob = new Person({ name: "Rob" });
var peter = new Person({ name: "Peter" });

 declare.safeMixin(rob, {
    secondMessage: "bar",
    speak: function() {
        this.inherited(arguments);
        console.log("result  is  =  "+ this.secondMessage);
    }
  });

lang.mixin(peter, {
    secondMessage: "bar",
    speak: function() {
        // this.inherited(arguments); // would cause an error
        console.log("result  is  =  "+  this.secondMessage);
    }
  });

rob.speak();
peter.speak();

});

اگر  کد بالا  رو  اجرا کنید یه همچین  چیزی  به عنوان  خروجی  خواهید داشت.

result  is  =  foo
result  is  =  bar
result  is  =  bar

اما  چرا ؟؟؟!!

خوب   اینجا تفاوت  این  دو  function   رو  متوجه میشیم. با  declare.safeMixin   شما میتونین  دقیقا  همون function   کلاس  پدر  رو  داشته باشین  که  bussines    خودش  رو داشته باشه..یعنی  کلاس  پدر  رو  overrride   نکنه..و  تو  کلاس  دوم  هم  یه   function   به همون   اسم داشته باشین  که  اوم هم   business  خودش  رو داشته باشه.

 declare.safeMixin(rob, {
    secondMessage: "bar",
    speak: function() {
        this.inherited(arguments);
        console.log("result  is  =  "+ this.secondMessage);
    }
  });

 

تو این  قسمت ما  کلاس   rob   رو   extend    گردیم..با استفاده  از  safeMixin.  این متد  علاوه  بر اینکه  شئ  دوم   رو  به  rob    اضافه  کرده ،   متد  یا   فانکشن    speak    رو   override  نکرده.

شاید  بپرسین  کار  این خط       this.inherited(arguments)  چیه. دقت کنین  اگر  شما  کلاس خودتون  رو  با  Declare   تعریف کرده باشین ، میتونین  از  این  function  استفاده کنین..کاری  انجام میده این  هست که  اگر  در کلاس  پدر یا همون  person ,   ما یک  function   هم  نام  داشته باشیم  ، اون رو    بدون اینکه  functio   کلاس فرزند  ،روش  تغیری   انجم بده  یا  تآثیری  روش  بذاره   ،  اجرا  خواهد کرد.

 


 

وقتی  یه پروژه  ساده    و  کوچیک دارین ،  این  مفاهیم  شاید  زیاد به دردتون  نخوره ،  اما  وقتی  پروژه  بزرگ  میشه  ،  مجبور  میشین  از  این جور چیز ها بیشتر  استفاده کنین...

امیدوارم  به دردتون  بخوره....در پناه خدا باشین