Думаю, вы упускаете суть.(Или, может быть, другие ответчики упускают суть.) ECMAScript предоставляет «закулисный» механизм получения / установки, так что
x.foo = 3;
y = x.foo;
действительно переводит в (вроде)
x.PutValue("foo",3);
y = x.GetValue("foo");
, где PutValue
и GetValue
- безымянные, не доступные напрямую функции для сеттеров и геттеры для свойств.(См. Стандарт ECMAScript, 3-е изд. , раздел 8.7.1. И 8.7.2.) 3-е издание, по-видимому, явно не определяет, как пользователи могут настраивать пользовательские методы получения и установки.Реализация JavaScript в Mozilla была и остается, например (это JSDB , использующий Javascript 1.8):
js>x = {counter: 0};
[object Object]
js>x.__defineGetter__("foo", function() {return this.counter++; });
js>x.foo
0
js>x.foo
1
js>x.foo
2
js>x.foo
3
js>x.foo
4
Синтаксис (или, по крайней мере, до сих пор) былконкретный.В частности, отсутствует Internet Explorer, по крайней мере, согласно этому вопросу SO .
Пятое издание стандарта ECMAScript, похоже, стандартизирует этот механизм.См. этот вопрос о геттерах и установщиках .
edit : возможно, более практичный пример для ваших целей:
function makePrivateObject()
{
var state = 0;
var out = {};
out.__defineSetter__("foo", function(x) {});
// prevent foo from being assigned directly
out.__defineGetter__("foo", function() { return state; });
out.count = function() { return state++; }
return out;
}
js>x = makePrivateObject()
[object Object]
js>x.foo
0
js>x.foo = 33
33
js>x.foo
0
js>x.count()
0
js>x.count()
1
js>x.count()
2
js>x.foo
3