2016-12-20 2 views
2

Когда я запускаю следующий код:конструктор не является функцией ошибки в JavaScript

function eatingFood(food){ 
    this.food = food; 
    return 'I"m eating' + this.food; 
} 

var apple = new eatingFood("apple"); 
console.log(apple()); 

я получил следующее сообщение об ошибке:

apple is not a function error.

Почему это?

+0

'apple' имеет строковое значение, которое возвращенное' новым eatingFood ("яблоко"); 'не функция – azad

+2

Вы не должны возвращаться в конструкторе. –

+3

Почему вы ожидаете, что 'apple' будет функцией? Вы называете 'eatFood'' 'новым'. 'new Func()' возвращает объект. Как вы думаете, что делает «новый»? Вы читали что-то о 'new', например [документация MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new)? –

ответ

0

Чтобы сделать текущий код работающим, вам нужно сделать несколько вещей.

  1. Удалить обозначение объекта класса.
  2. Возврат функции.

function eatingFood(food){ 
 
    this.food = food; 
 
    return function() { 
 
    return 'I"m eating ' + this.food; 
 
    }; 
 
} 
 

 
var apple = eatingFood("apple"); 
 
console.log(apple());

Если вы действительно намерены создать объект, то вы можете очень хорошо использовать следующий формат.

function eatingFood(food){ 
 
    this.food = food; 
 
    this.toString = function() { 
 
    return 'I"m eating ' + this.food; 
 
    }; 
 
} 
 

 
var apple = new eatingFood("apple"); 
 
console.log(apple.toString());

+0

Обязательно выполнять функцию внутри функции, если я хочу использовать новое() ключевое слово или aka создать экземпляр? – Devalor

+0

@Devalor Подумайте об этом: зачем нужен новый экземпляр 'eatFood'? Ближайшей логической задачей было бы создать конструктор 'Food' вместо' eat'. – Li357

+0

@Devalor См. Мой обновленный ответ. –

-1

Используя new ключевое слово, var apple будет объект, который похож на {food: 'apple'}.

И .. ну ... вы не можете положить две круглые скобки в конце объекта, поскольку объекты не являются функциями!

+2

Чтобы быть более точным, 'apple' является * переменной *. Конечно, вы можете иметь переменную, за которой следует скобка (т. Е. Выражение вызова). Однако значение, которое переменная разрешает, имеет значение, и в этом случае это не функция. –

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