2013-02-14 14 views
0

Я немного погуглил, и, похоже, я либо не знаю, что я прошу, либо это невозможно. Я думаю, что это, вероятно, первая.javascript - преобразовать функцию в переменную

Если у меня есть объект

obj = { 
    func : function(){ 
    return 'hello'; 
    } 
} 

и я обычно делаю alert(obj.func()) я, конечно, получить "hello"

Но если бы я хотел иметь obj.func быть просто переменная, является то, что можно как-то? Я никогда не буду передавать параметры функции, я просто хочу ссылаться на его возвращаемое значение как на обычную переменную вроде alert(obj.func), а не на вызов функции.

Спасибо.

+0

'obj.func = obj.func();' – Bergi

ответ

4

Попробуйте это:

obj = { 
    func : (function(){ 
    return 'hello'; 
    })() 
} 
+0

удивительным! Это именно то, чего мне не хватало. Если я понимаю правильно, первый (...) является результатом функции, то есть возвращаемое значение, а второе() в конце фактически вызывает эту функцию? – tim

+2

в двух словах да, javascript полон этих сумасшедших вещей, я предлагаю вам прочитать http://eloquentjavascript.net/contents.html, который сделает вас убийцей javascript-программистом (ну хотя бы лучше ...). – mpm

+0

спасибо за ссылку - так освежающе видеть простые сайты ...как настоящая книга! – tim

2

Да, тот легко!

var obj = { 
    func : 'hello' 
}; 

alert(obj.func); 

видеть это работает fiddle

, если вы хотите быть вычисленное значение или н. Вы все еще можете позволить ей быть функцией, но вызываемая как простое свойство:

var obj = { 
    func : (function(){return 'hello';})() 
}; 
+1

yup точно. Благодарю. Я не могу принять несколько ответов, так что +1 должно хватить :) – tim

+0

awww ... sweet: P – nozzleman

2

То, что вы говорите о том, геттер: это функция, которая работает как свойство. Это стандарт, так как javascript 1.8.5, что означает, что старый браузер не справится с этим.
Синтаксис выглядит следующим образом, используя ваш пример:

obj = { 
    get func() { return "hello" ; } 
}; 
// use like this : 
console.log(obj.func); 

Скорее всего, вы хотите, чтобы определить сеттер также: это также функция ведет себя как свойство. Синтаксис будет:

obj = { 
    get func() { return this._innerText ; }, 
    set func(txt) { this._innerText = txt ; }, 
    _innerText : "hello" 
}; 

console.log(obj.func) ; // output is hello 
obj.func = "godd bye" ; 
console.log(obj.func) ; // output is good bye 

Очевидно, как часто с простого примера, этот один не имеет большого использования:

Давайте посмотрим степень в радианах преобразователя с использованием геттер/сеттер:

var Angle = { 
     get degree()  { return this._degree ; }, 
     set degree (dg)  { this._degree = dg ; }, 
     get radian()  { return 2*Math.PI*this.degree/360 ; }, 
     set radian (rd)  { this._degree = rd * 360/(2*Math.PI) ; }, 
     _degree : 0 
} ; 
// you can use : 
Angle.radian = Math.PI/2; 
console.log (Angle.degree); // -->> output is 90 
Angle.degree=45 ; 
console.log(Angle.radian) ;  // --> output is 0.7853... which is PI/4 

Вы также можете взглянуть на Object.defineProperty, который позволяет определять как стандартные свойства, так и геттеры/сеттеры, но с большим количеством параметров, особенно вариант «скрыть» свойство, которое позволяет ему не перечислить.

Для получения дополнительной информации:
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/get https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/set https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty

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