2014-01-11 6 views
0

У меня есть аналогичные установки:Возвращаемое значение из функции автоматического вызова JavaScript?

this.engine = function() 
{ 
    // Select engine... 
    return justTheRightEngine; 
} 

// Later somewhere in the implementation... 
this.engine().doSomeWork(); 

Я был бы рад избавиться от скобки после engine, поэтому я попытался назначить его функцию автоматического вызова:

this.engine = (function() 
{ 
    // Select engine... 
    return justTheRightEngine; 
})(); 

// Later somewhere in the implementation... 
this.engine.doSomeWork(); 

Но авто Функция -Calling просто не возвращается с любым значением (вместо этого она фактически возвращает объект Window). Есть ли синтаксис/хак, который я могу использовать здесь, помимо функции автоматического вызова?

+0

Когда 'justTheRightEngine' доступны? Если он недоступен в то время, когда 'this.engine' будет инициализирован, но будет доступен позже, тогда может оказаться целесообразной функция, дающая команду' engine(). – Paul

+0

@Geri Я подозреваю, что у вас есть .net-фон, поэтому вы любите геттеров. К счастью, это возможно. Я добавил решение, проверьте его;) –

+0

@EdgarVillegasAlvarado У меня есть основной объект Objective-C, поэтому я люблю чистые проекты, а не получатели в частности. На самом деле работает над инструментарием Objective для JavaScript. Я не могу продвигаться вперед с этим материалом прототипа. Напряжение для правильных ссылок на суперкласс, методы класса и многое другое. – Geri

ответ

1

Да, это возможно. В последние браузеры (FF> = 2,0, хром> = 1, IE> = 9, опера> = 9.5, Сафари> = 3), это будет работать:

Object.defineProperty(this, 'engine', {get : function(){ 
    //Select engine ... 
    return justTheRightEngine; 
}}); 

мы добавим свойство геттер ,

Тогда вы можете назвать это нравится:

this.engine.doSomeWork(); 

точно так, как вы хотите.

Подробнее: JavaScript Get Operator

+0

Бедные мальчики и девочки, застрявшие с XP/IE8, не смогут наслаждаться этим. –

+1

Просто используя 'get engine() {return justTheRightEngine; } 'на самом деле кажется достаточно. – Geri

+0

@kuroineko Они не смогут наслаждаться чем-либо еще на самом деле ... – Geri

0

Разница для функции является то, что она больше не вызывается как метод объекта, но в качестве автономной функции, так this будет относиться к window объекту вместо вашего объекта , Используйте call method называть это как метод объекта:

this.engine = (function() 
{ 
    // Select engine... 
    return justTheRightEngine; 
}).call(this); 
+0

Спасибо, но это еще не возвращает правильное значение в 'engine'. – Geri

+0

@Geri: Тогда вы, вероятно, запускаете код слишком рано, то есть когда значения, необходимые для кода, еще не существуют. – Guffa

0

только ради полноты, простой

if (something_tells_me_this_engine_is_right()) 
    this.engine = justTheRightEngine; 

, вероятно, сделать трюк в большинстве случаев, и пусть люди застряли с IE8/XP также пользуются шоу.

Если вам не нужно, конечно, перед каждым звонком убедиться, что кто-то не скрытно превратил ваш FireFox в браузер Opera с момента последнего запуска вашего двигателя.

(выходит сцена с маниакальной хихи)

Смежные вопросы