Собственно, вместо тысячи слов:
var TestObj = {};
TestObj.Trigger = false;
TestObj.SomeValue = undefined;
//TestObj._SomeValue_buffer = undefined; /* если раскомментить, всё будет ок; или если удалить "TestObj._SomeValue_buffer = false;" в коде ниже; */
var SomeValue_setter = function( v ){
if ( TestObj.Trigger ){
TestObj._SomeValue = v;
} else {
TestObj._SomeValue_buffer = v;
}
};
var SomeValue_getter = function( v ){
if ( TestObj._SomeValue === undefined ){
TestObj._SomeValue = 10;
}
return TestObj._SomeValue;
};
TestObj.__defineSetter__( 'SomeValue' , SomeValue_setter );
TestObj.__defineGetter__( 'SomeValue' , SomeValue_getter );
TestObj.SomeFunction = function(){
TestObj.Trigger = true;
if ( TestObj._SomeValue_buffer ){
TestObj.SomeValue = TestObj._SomeValue_buffer;
TestObj._SomeValue_buffer = false; /* если грохнуть эту строку - всё будет ок; или если раскомментить "TestObj._SomeValue_buffer = undefined;" в коде выше; */
}
}
TestObj.SomeValue = 15; /* инициализируем TestObj._SomeValue_buffer */
console.log( 'Before: ' );
console.log( TestObj.SomeValue ); /* 10 - ok */
console.log( TestObj._SomeValue ); /* 10 - ok */
console.log( TestObj._SomeValue_buffer ); /* 15 - ok */
console.log( 'setter/getter: ' + !!TestObj.__lookupSetter__( 'SomeValue' ) + '/' + !!TestObj.__lookupGetter__( 'SomeValue' ) ); /* true/true - ok */
TestObj.SomeFunction();
console.log( 'After: ' );
console.log( TestObj.SomeValue ); /* UNDEFINED - упс!.. должно быть 15 */
console.log( TestObj._SomeValue ); /* 15 - ok */
console.log( TestObj._SomeValue_buffer ); /* false - ok */
console.log( 'setter/getter: ' + !!TestObj.__lookupSetter__( 'SomeValue' ) + '/' + !!TestObj.__lookupGetter__( 'SomeValue' ) ); /* true/FALSE - упс!... испарился геттер */
// Chrome: 30.0.1599.101 m
Тот же код под FF 24.0 работает вполне предсказуемо и геттер никуда не исчезает. Можно было бы списать на область видимости переменных (TestObj._SomeValue_buffer используется только в сеттере и не объявлен в шапке), но мы же всё равно явно обращаемся к пространству имён TestObj, да и этот исчезающий геттер…
В общем, если кто в курсе, почему оно работает именно ТАК, а не иначе — объясните, пожалуйста. Если это всё же моя ошибка, а не баг, конечно.