2013-09-16 4 views
3

Я изучаю какой-то код вне моего объема, который написан в стиле, который я никогда раньше не видел. Я пытаюсь понять внутреннюю работу следующего мешка собственности:Property Bag in javascript

сеттер:

props.Property(name) = val; 

Getter:

val = props.Property(name); 

Что бы вам нужно создать экземпляр для сеттер функционировать, как описано выше ?

EDIT: Менее упрощение, этот код успешно работает в браузереWindow в кадре (аналогично среде телефона).

var UI = 
     { 
      ready: function(oProps) 
      { 
       try 
       { 
        if (oProps) 
        { 
         window.external.Property(UI.FrameWidth) = '1000'; 
         window.external.Property(UI.FrameHeight) = '900'; 
        } 

        window.external.Ready(); 
       } 
       catch (e) { } 
      } 
    }; 

Спасибо заранее,

+4

Этот код сеттера не выглядит законным. 'props.Property (name)' не является Lvalue. Вы уверены, что это точный код? – Jacob

+0

Мои мысли точно. Я могу подтвердить, что это без опечатки. – Valchris

+1

Возвращаемое значение вызова функции является значением, а не ссылкой. Это приведет к исходной ошибке. –

ответ

8

Я думаю, что это может быть просто каким-то странным старым JScript синтаксис. Рулевой от «внутренней функции возвращает ссылку» идею из комментариев, я нашел вопрос о differences between JavaScript and JScript и только разница синтаксис перечисленное это один:

The idiom f(x) = y, which is roughly equivalent to f[x] = y.

Существует не слишком найти информацию об этой идиомы, хотя , Однако this book about Jscript.Net кратко упоминает, что

you can access any expando properties using square brackets or parenthesis.

«expando», кажется, модификатор для классов, который позволяет добавить динамические свойства.

+1

Я думаю, вы нашли именно то, что я искал. В целевом браузере используется реализация JScript. Прежде чем закончить мой ответ, я сделаю немного больше исследований. – Valchris

+2

Вы правы. Я действительно пытался найти «различия между JScript и JavaScript», когда увидел этот вопрос, но все, что я натолкнулся, было [любое количество людей] (http://stackoverflow.com/questions/135203/whats-the-difference-between -javascript-and-jscript) (включая самого Дугласа Крокфорда!), говоря, что JScript и JavaScript отличаются только именем. Думаю, я слишком скоро сдал эту линию расследования. Изменить: [Правильный ответ] (http://stackoverflow.com/a/135256/1726343) (который упоминает это различие) был похоронен под несколькими другими ответами, которые говорят JScript === JavaScript –

3

Код выше заворачивают в сайлент-блока попытка поймать, так что возможно, что это кажется быть запущен успешно, но на самом деле это не так.

Попробуйте зарегистрировать исключение пойманного в блоке catch. Вы должны получить ReferenceError, если эту строку:

window.external.Property(UI.FrameWidth) = '1000'; 

когда-либо удар (который, конечно, зависит от величины oProps).

1

Этот метод настройки не может работать. Независимо от того, какая функция возвращает, если используется вызов функции в качестве единственного выражения левой части (LHS) выражения присваивания, вы получаете

ReferenceError: Invalid left-hand side in assignment

и тому подобное. Как говорили другие, вы не видите исключение ReferenceError, потому что оно поймано, когда его бросают, и нет кода для его обработки. Функции являются первоклассными объектами, но звонки им неvalid LHS values. Вы увидите это ясно, если вставить console.log(e); в блок catch.

Этот подход с геттером может работать. Однако, если вы хотите, методы получения и установки, на последней в соответствующей реализации ECMAScript Edition, 5 you can have that natively:

Object.defineProperty(props, "name", (function() { 
    var _value; 

    return { 
    set: function (value) { 
     /* setter code, simple example */ 
     _value = String(value); 
    }, 

    get: function() { 
     /* getter code, simple example */ 
     return _value; 
    } 
    }; 
}())); 

/* triggers the setter */ 
props.name = 42; 

/* triggers the getter */ 
var x = props.name; 

/* "42" */ 
x 

«Edit 2» -

var someObjs = [{a:"",someProp:"b"}]; 
(function (a) { return someObjs[a]})(0).someProp = "c"; 
console.log(someObjs[0].someProp); 

- работает, потому что возвращаемое значение функции используется как LHS, но как часть другое выражение, которое оценивает доступ к собственности (с использованием синтаксиса доступа к объекту dot). Функция возвращает ссылку на объект (на экземпляр Object), чье свойство затем открывается. Доступ к свойствам является LHS выражения присваивания, этому свойству присваивается значение RHS ("c").

Это функционально эквивалентно

var someObjs = [ 
    {a: "", someProp: "b"} 
]; 

(function() { 
    return someObjs[0]; 
}()).someProp = "c"; 

console.log(someObjs[0].someProp); 

и, следовательно, к

someObjs[0].someProp = "c"; 
console.log(someObjs[0].someProp); 

(как вы можете видеть, хороший стиль кода помогает много с пониманием кода)

+0

Спасибо за ваш пробой PointedEars. Я планирую получить больше контекста завтра и, надеюсь, это поможет мне понять, действительно ли это происходит. – Valchris