2014-01-20 2 views
0

Я пытаюсь создать поглотитель на следующее:Javascript геттер частных переменных

function Field(val){ 
    this.value = {}; 
} 

Field.prototype = { 
    get value(){ 
     return this._value; 
    }, 
    set value(val){ 
     this._value = val; 
    } 
}; 

Но что мне удалось достичь, это добытчик для field.value

Я хочу, чтобы достичь чего-то вроде этого :

field.value.foo['20'] = 'some_value'; // ==> Setter 
field.value.foo['20']; // 'some_value' ==> Getter 

Но я не смог этого добиться, используя код выше .. Может кто-то помочь ..

+0

Инициализируйте контейнер как 'this.value = {foo: {}};'? –

+0

Все ли ваши индексы целые? Вы можете сделать свой объект [похожим на массив] (http://stackoverflow.com/questions/11886578/creating-array-like-objects-in-javascript). – Emissary

+0

@Emissary Это не достигнет желаемой цели: сделайте значения частными. –

ответ

0

Вы действительно можете решить эту проблему в ES5. Я документально это здесь, для других пользователей, чтобы помочь получить от него ..

function Foo() { 
    this.__value__ = {}; 
    this.__value__['20'] = 'some_value'; 
}; 

Foo.prototype.__defineGetter__('foo', function() { 
    return this.__value__; 
}); 

function Field() { 
    this.__value__ = new Foo(); 
}; 

Field.prototype.__defineGetter__('value', function() { 
    return this.__value__; 
}); 

Теперь, чтобы проверить это ..

var field = new Field(); 
var value = field.value.foo['20']; 
console.log(value); 

Я обновил JSFiddle here

+0

awesome @ r8k .. большое спасибо .. – user3216499

+1

Не используйте это! Вы забыли [большое предупреждение из MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineGetter): * Нестандартный Эта функция - стандартным и не соответствует стандартам. Не используйте его на производственных площадках, обращенных к Интернету: он не будет работать для каждого пользователя. Также могут быть большие несовместимости между реализациями, и поведение может измениться в будущем. * –

1

Что вы хотите - это общий приемник/сеттер, способный изменить любое свойство вашего объекта value.

К сожалению, это невозможно в текущей версии ECMAScript, вам придется подождать proxies, который должен быть доступен с ECMAScript 6 (и доступен в последнем gecko).

См. ES6 wiki for direct proxies.

Между тем, вероятно, существует решение с текущим состоянием JavaScript для вашей реальной проблемы.

+0

Можете ли вы пролить некоторый свет на «решение с текущим состоянием JavaScript»? – user3216499

+0

@ user3216499 «для вашей настоящей проблемы». Я имею в виду: то, что вы точно просите в большинстве браузеров, пока невозможно, поэтому вам нужно начать с **, почему ** вы хотите сделать это и искать другой дизайн. –

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