2012-06-13 5 views
4

При работе с JavaScript я сталкивался с ситуацией, когда я не уверен, если то, что я пытаюсь выполнить возможно:Javascript автоматически добавить свойства при расширении объекта

Учитывая следующий объект:

var data = {}; 

можно ли изменить «данные» таким образом, чтобы при расширении его следующим образом

data.entry_1 = { 
    'prop_1': 'set_1', 
    'prop_2': 'set_2' 
}; 

новое свойство получает автоматически прикрепленным к новому Ob ject, т. е.

data.entry_1 = { 
    'prop_1': 'set_1', 
    'prop_2': 'set_2', 
    id: 1 // automatically created property 
}; 

Возможно ли выполнить вышеуказанное без использования «внешних» методов, например. no data.newEntry (объект)?

+0

Загляните в прототипы javascript. – frenchie

+1

В настоящее время нет никакого способа сделать это, но подождите некоторое время и повторите попытку, когда Firefox выкинет [Прокси-объекты] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Proxy «Прокси-MDN»)). Если вы слишком нетерпеливы, вы даже можете воспользоваться [узлом-прокси] (https://github.com/samshull/node-proxy «samshull/node-proxy»). Приветствия. =) –

ответ

1
var data = { 
    set entry_1 (val) { 
     for(var i in val) { this[i] = val[i] }; 
     this["id"] = 1; 
    } 
} 

Поддерживается в IE9 + и других современных браузерах.

+0

Спасибо за все ответы! Я не буду использовать прототипы, поскольку беспорядок с Object.prototype на самом деле не то, что я хочу ... Что касается установщиков: это ближе всего к тому, что я ищу. Если можно задать общий сеттер, то есть не только для enty_1, но и для любой записи x, моя проблема будет решена. И это то, что прокси-серверы получают, по крайней мере, из того, что я читал в Mozilla. Угадайте, пока я буду придерживаться хороших методов объектов. Еще раз спасибо за ответы! –