سؤال

أبحث عن طريقة أنيقة لتجاوز القيم في صفيف ترابط.

على سبيل المثال ، قل أن لدي خيارات القاعدة الخاصة بي على النحو التالي:

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);

قد يبدو ذلك وكأنه مبالغة ، ولكن يمكنك إضافة جميع الحالات الجديدة إلى صفيف واستخدام حلقة لهم عندما تريد/تحتاج إلى تغييرها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top