JavaScript: وراثة+تعديل صفيف الترابط؟
-
01-10-2019 - |
سؤال
أبحث عن طريقة أنيقة لتجاوز القيم في صفيف ترابط.
على سبيل المثال ، قل أن لدي خيارات القاعدة الخاصة بي على النحو التالي:
var base_options = {
hintText:"something",
borderStyle:Titanium.UI.INPUT_BORDERSTYLE_ROUNDED,
width: 200, height: LABEL_HEIGHT-4,
font: {fontSize:16}, left: 95
}
أرغب في استخدام هذا كقاعدة ، ولكن أكون قادرًا على تجاوز بعض العناصر في هذه القاعدة على أساس كل حالة على حدة-على سبيل المثال ، سيكون النص Hinttext مختلفًا لكل عنصر. ما هي الطريقة النظيفة والأنيقة للحصول على نسخة من هذه الصفيف مع تعديل بعض المعلمات؟
أدرك أنه يمكنني تغيير كل عنصر فردي ، كما في:
options.hintText = "new thing";
لكني أظن أن هناك طريقة أكثر أناقة.
المحلول
يمكنك استخدام فئة قاعدة لتغليف السلوك الذي اقترحه ويستون.
function Options(changed_options) {
this.hintText = "something";
this.borderStyle =Titanium.UI.INPUT_BORDERSTYLE_ROUNDED;
// ...
if(changed_options)
for(var prop in changed_options)
this[prop] = changed_options[prop];
}
var foo = new Options({ "hintText":"changed"});
يجب أن تعمل.
نصائح أخرى
لقد قمت بتنفيذ هذه الوظيفة في عدد قليل من مشاريعي:
if (typeof Object.merge !== 'function') {
Object.merge = function (o1, o2) { // Function to merge all of the properties from one object into another
for(var i in o2) { o1[i] = o2[i]; }
return o1;
};
}
لذا ، الآن يمكنني استخدامه مثل:
Object.merge(options, {hintText: "new thing", left: 55});
بقدر نسخ الأشياء ، هناك بالفعل جيد مناقشة Stackoverflow عن ذلك.
شيء من هذا القبيل؟
var changed_options = {
hintText: "somethingElse",
font: {fontSize: 24}
}
for(var prop in changed_options)
base_options[prop] = changed_options[prop];
function merge(base, options) {
var result = {};
for (var k in base) if (base.hasOwnProperty(k)) {
result[k] = options[k] || base[k];
} // note, it will leave out properties that are in options, but not in base..
return result;
}
إذا كنت تستخدم jQuery ، فإنه يحتوي على بنية extend
طريقة على كائن jQuery الذي يقوم بذلك.
يمكنك استخدام النموذج الأولي للكائن لتحديد الميراث ، مثل هذا:
function inherited_object(extra_properties){
for(var i in extra_properties){
this[i] = extra_properties[i];
}
}
function inherit_from(parent, extra_properties){
inherited_object.prototype = parent;
var obj = new inherited_object(extra_properties || {});
inherited_object.prototype = null;
return obj;
}
ثم ، إذا كان لديك بعض الأشياء A
أنت فقط اتصل B = inherit_from(A, B_stuff)
وهذا كل شيء. ميزة واحدة هي ذلك ، لأن A
هو النموذج الأولي ل B
, ، التغييرات التي تم إجراؤها A
تنعكس على B
.
var base_options = function() {
hintText:arguments[0],
borderStyle:arguments[1],
width:arguments[2],
height:arguments[3],
font:arguments[4]
left:arguments[5]
};
var thisObj = new base_option(blah, blah, blah, blah, blah);
قد يبدو ذلك وكأنه مبالغة ، ولكن يمكنك إضافة جميع الحالات الجديدة إلى صفيف واستخدام حلقة لهم عندما تريد/تحتاج إلى تغييرها.