My name is Vasyl Khrystiuk‎ > ‎pub‎ > ‎JavaScript‎ > ‎

reflection getters and setters

Tags: javascript_tag

Все началось из поиска особенностей работы оператора delete
А особенность такова - локальные переменные объявленные с помощью ключевого слова var не могут быть удалены. (Тут не забываем, что если владельца нет и ключевого слова нет, то владелец - глобальный объект или просто окно)

Но большее внимание привлекло описание в доке - там еще сказано, что удалить свойство нельзя, если оно объявлено  как  DontDelete. И это меня заинтересовало.

Вот что я нашел: http://webreflection.blogspot.com/2011/02/btw-getters-setters-for-ie-6-7-and-8.html 
Исходник прилагается:  http://devpro.it/code/210.html Очень интересная вещь.

Там много кружлений вокруг ИЕ вплоть до вызова VBScript.

Но рассмотрим какую функцию сгенерировала функция для моего  Chrome/17.0.963.56.

function createStatic(definition{
            var {}, currentkey ;
            for (key in definition{
                if (hasOwnProperty.call(definitionkey){
                    current definition[key];
                    current.enumerable 1;
                    current.configurable 0;
                    defineProperty(okeycurrent);
                }
            }
            freeze(o);
            return o;
        

По freeze(o); и defineProperty видно, что работаем в with(Object) или внутри самого Object. Если посмотреть исходник еще раз, то становится ясно что тут как раз второй случай. 

Теперь пример использования:

var Static Object.createStatic({
    // public
    value{
        getfunction ({
            console.log('get value call, returning '+this._value);
            return this._value;
        },
        setfunction (value{
            console.log('set value call, setting '+value);
            this._value value;
        }
    },
    // "protected"
    _value{
        writabletrue,
        value123
    }
});

// will invoke the setter
Static.value 456;
alert(Static.value)// 456

// will throw an exception
// or it won't work
Static.whatever "no way";

И вывод: 
set value call, setting 456
get value call, returning 456
undefined



Найдено позже:



Comments