2013-08-01 5 views
1

Я пытаюсь сделать что-то вродеЛенивые параметры нагрузки значения

var foo = { 
    bar: '' // do some magic here 
}; 

и только тогда, когда мне нужно использовать значение (позже на странице) просто вызовите свойство будет работать ленивую нагрузку и отправить обратно Значение

Типичным примером является то, что у меня есть restfull API, который загружает пользователя при открытии страницы. После перехода в меню я хочу получить доступ к связанному с ним свойству (другому объекту), но он находится в другом api, и я не хочу загружать все в открытии.

Есть ли какой-нибудь слушатель по вызову собственности?

+2

Я думаю, вам придется использовать некоторые геттеры (/ сеттеры) здесь (возможно, с кешированием) – yent

+0

простой ответ? nop ... И я не думаю, что было бы очень хорошей практикой реализовать это JS для вашего случая использования ... – NDM

+0

@NickyDeMaeyer Есть ли особая причина не использовать это в этом случае? – Jihel

ответ

2

Использование Object.definePropery для расчета foo.bar динамически. Он работает в all modern browsers.

var foo = { }; 
Object.defineProperty(
    foo, 
    "bar", 
    { 
     get: function() { 
      return 'magic return value'; 
     } 
    } 
    ); 

JSFiddle: http://jsfiddle.net/wFYxb/

+1

Вы также можете кэшировать значение в get(), чтобы вызов api делался только один раз. –

+0

@MukeshSoni конечно, но бывают случаи, когда вы хотите, чтобы свойство возвращало другое значение при каждом вызове. –

+0

Вот оно! Благодаря :) – Jihel

1

Похоже, ваша собственность должна быть просто определение функции, и выполнить функцию по требованию:

var foo = { 
    bar: function() { return goDoSomething(); } 
}; 

foo.bar(); 

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

var foo = new function() { 
    var _bar; 
    this.bar = function() { 
     if (!_bar) { 
      _bar = goDoSomething(); 
     } 
     return _bar; 
    } 
}(); 


function goDoSomething() { 
    console.log("goDoSomething();"); 
    return 4; 
} 
+2

Должно быть: 'вместо' = 'после' bar', поскольку это объект. – antyrat

+0

@antyrat Спасибо, исправлено. Сейчас я нахожусь в концепции анонимного типа C#. –

1

Если это именно то, что вы хотите сделать, все объекты JavaScript в Firefox/Chrome/некоторые другие имеют __defineGetter__ свойства, которое можно использовать для определения ленивых вычисленных значений ,

> a.__defineGetter__('b', function() {return 'c';}) 
> a.b 
"c" 
Смежные вопросы