حتما هنگام بازبینی یک کد نوشته شده با 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 کلاس فرزند ،روش تغیری انجم بده یا تآثیری روش بذاره ، اجرا خواهد کرد.
وقتی یه پروژه ساده و کوچیک دارین ، این مفاهیم شاید زیاد به دردتون نخوره ، اما وقتی پروژه بزرگ میشه ، مجبور میشین از این جور چیز ها بیشتر استفاده کنین...
امیدوارم به دردتون بخوره....در پناه خدا باشین