2010-08-22 3 views
17

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

<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> 
+1

Вы можете переместить эту часть кода «this.MyMethod = функция() { оповещения („Он работает“);» выше вызовов методов к MyMethod? и посмотреть, не изменилось ли это? – InSane

ответ

21

Есть две основные проблемы

  1. тип MIME является text/javascript, не text/jscript
  2. Вы определяете метод после вы пытаетесь вызвать его

Итак:

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

    var test = new MyObject(); 
+0

http://ejohn.org/apps/learn/#6 – sova

2

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

, но если вы инициализировать объект так:

var test = new MyObject(); 

, а затем сделать это:

test.myMethod(); 

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

-2

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

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

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

function nameOfTheFunction(arguments) { 
... 
} 

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

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

+1

Недостаток не так, как определяется метод, недостаток - это когда метод определен. –

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

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

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

1

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

во-первых, установив его свойство родительской функции, как это делается в " «Версия вашего скрипта ниже. Если вы это сделаете, функция будет использоваться только после, которую вы даете определению.

Во-вторых, определение функции с классическим подходом «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 
Смежные вопросы