Отражение в функции Javascript - PullRequest
2 голосов
/ 06 марта 2011

Вот небольшой фрагмент кода Javascript, где я использовал функцию для симуляции объекта.Я пытался размышлять над функциями-членами (которые действительно являются вложенными функциями функции), но почему-то код не работает.

Может кто-нибудь, пожалуйста, помогите мне понять, почему код не работает.Я пытаюсь понять основные принципы Javascript, из-за которых этот код не работает.

Спасибо.

var test = function () {

    var first = function first () {
        alert ("first");
    }

    var second = function second () {
        alert ("second");
    }

};

function getOwnFunctions(obj) {
    for(var f in obj) {
        if(typeof(f) == "function" && obj.hasOwnProperty(f)) {
           alert(f);
        }
    }
}

getOwnFunctions(test);

Ответы [ 3 ]

1 голос
/ 06 марта 2011

Пара очков здесь:

  1. var определяет область действия переменной, которая говорит, что first & second функции доступно только внутри test функция. Для имитации object, Вы хотите использовать ключевое слово this.
  2. for(var f in obj): петли for над объектом и возвращает keys in obj, поэтому typeof(f) всегда будет возвращать тип f переменная , которая будет string, вы хотите проверить typeof(obj[f]]) который вернется тип фактического базового свойство.
  3. Вы хотите позвонить getOwnFunctions с экземпляром test, а не актуальная test функция:

.

var test = function () {    
    this.first = function() {
        alert ("first");
    }    
    this.second = function() {
        alert ("second");
    }    
};    
function getOwnFunctions(obj) {
    for(var f in obj) {
        if(typeof(obj[f]) == "function" && obj.hasOwnProperty(f)) {
           alert(f);
        }
    }
}

getOwnFunctions(new test);
1 голос
/ 06 марта 2011

Поэтому, если вы хотите, чтобы у функции были «методы», вы бы рассматривали функцию как объект:

var test = function () {};

test.first = function first () {
  alert ("first");
}

test.second = function second () {
  alert ("second");
}

function getOwnFunctions(obj) {
  for(var f in obj) {
    if(typeof(f) == "function" && obj.hasOwnProperty(f)) {
      alert(f);
    }
  }
}

getOwnFunctions(test);

Самое замечательное здесь то, что вы можете делать такие вещи, как:

function x(y){
  alert( y );
}

x.test = function(){this('test');}

x.test();

Тест оповещений

1 голос
/ 06 марта 2011

Ключевое слово var вводит символ, который является локальным для динамической области вызова функции, а не контекстной области для this референта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...