JavaScript: наследование + модифицировать ассоциативный массив?

StackOverflow https://stackoverflow.com/questions/3570140

  •  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";

Но я подозреваю, что есть более элегантный путь.

Это было полезно?

Решение

Вы можете использовать базовый класс для инкапсуляции поведения Weston предлагает.

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

Что касается копирования объектов, уже есть хорошая Обсуждение стойки об этом.

Что-то вроде этого?

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