2010-08-25 2 views
2

Я ищу элегантный способ переопределить значения в ассоциативном массиве.Javascript: Inherit + изменить ассоциативный массив?

Например, скажем, у меня есть свои варианты базы как:

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

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

ответ

1

Вы можете использовать базовый класс для инкапсуляции поведения, предлагаемого 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"}); 

Должно работать.

+0

Это приятное решение, потому что существует меньшая вероятность случайного изменения базового объекта путем копирования ссылки на объект (в свойстве шрифта, например) на новый объект. Если вы хотите избежать этого с помощью других решений, вам придется создавать копии объектов. –

0

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

var changed_options = { 
    hintText: "somethingElse", 
    font: {fontSize: 24} 
} 

for(var prop in changed_options) 
    base_options[prop] = changed_options[prop]; 
+0

Не должно быть 'base_options [prop] = changed_options [prop];'? – Zebi

+0

Хороший улов, Зеби - отредактированный. –

0
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, что делает это.

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

Это может показаться излишним, но тогда вы можете добавить все новые экземпляры в массив и использовать для контура для них, если вы хотите/потребность изменить их.

+0

Это ** очень ** хрупкий код. Ссылка на аргументы по индексу вызывает у вас проблемы очень быстро, и читать их не особенно приятно. – Zebi

+0

Если вы идете вниз и ответьте, пожалуйста, объясните, почему. Это поможет мне не отправлять неправильные ответы, если это неправильно. Спасибо. // Извините @Zebi, моя страница была медленной в обновлении. – John

+0

Это зависит от кодера и понимания кода, который они пишут. Это не противоречит написанию цикла for с использованием индекса для доступа к каждому свойству в массиве, нет? – John

0

Я реализовал эту функцию в некоторых из моих проектов:

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 discussion примерно это.

0

Вы можете использовать прототип объекта, чтобы установить наследование, например:

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.

Смежные вопросы