Подтвердить что ты не робот

Javascript - Как вы вызываете функцию внутри класса из этого класса?

Я пытаюсь вызвать функцию MyMethod изнутри объекта, но ни один из синтаксисов ниже не работает. Должна быть действительно очевидная ошибка ниже, но я не вижу ее.

<html xmlns="http://www.w3.org/1999/xhtml">
<head>

   <script type="text/jscript">

     function MyObject() {

       //how do I get one of these to work??
       this.MyMethod; //does not work
       this.MyMethod(); //does not work either
       MyMethod(); //does not work either

       this.MyMethod = function () {
         alert('It works');
       }
     }

     var test = new MyObject();

   </script>

</head>
<body>

</body>
</html>
4b9b3361

Ответ 1

Существуют две основные проблемы:

  • Тип MIME text/javascript, а не text/jscript
  • Вы определяете метод после, который вы пытаетесь вызвать.

Итак:

  function MyObject() {
    this.MyMethod = function () {
      alert('It works');
    }
    this.MyMethod(); //should now work
  }

  var test = new MyObject();

Ответ 2

вы поместили вызов в частный метод внутри конструктора класса javascript. в этой точке функции еще не инициализированы

но если вы инициализируете объект следующим образом:

var test = new MyObject(); 

а затем выполните следующее:

test.myMethod();

он будет работать.

Ответ 3

2 способа определения функции обеспечивают различные возможности доступа

Сначала установите для него свойство родительской функции, как это сделано в версии "A" вашего script ниже. Если вы это сделаете, функция будет использоваться только после, которую вы дадите определению.

Во-вторых, определение функции с классическим подходом "function functionName() {...}". Это определение подвергается "подъему", что означает, что функция становится доступной по всему родительскому объекту, т.е. Даже над местом, которое оно определено. Вы можете увидеть это в версии "B" в примере ниже, на основе исходного кода постера. Также на https://jsfiddle.net/dnL4j30u/

<script>
  function MyObject() {

    MyMethod(); 

    this.MyMethod = function() {
      console.log('It works A');
    }

    this.MyMethod(); 

    MyMethod(); 

    function MyMethod() {
      console.log('It works B');
    }

  }
  var test = new MyObject();
</script>

Выходной сигнал

 It works B       (this works because the second definition gets hoisted)
 It works A
 It works B

Ответ 4

var MyObject = function MyObject() {
       this.MyMethod = function () {
         alert('It works');
       } }

var test = new MyObject(); test.MyMethod();

Вышеприведенное. Или вы можете просто создать конструктор и вызвать этот метод внутри него. Поэтому во время создания объекта он будет называть this.MyMethod()

Ответ 5

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

http://ejohn.org/apps/learn/#5

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

function nameOfTheFunction( arguments ) {
...
}

Я нашел, что следующая ссылка будет очень полезна:

http://www.dustindiaz.com/javascript-function-declaration-ambiguity/