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>
Ответы
Ответ 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/