Как я могу вызвать функцию-прототип из основной функции / конструктора объекта в javascript. Я пробовал следующее, но не работает. Что я делаю неправильно?

var x = new myFunction('Hello World!');

function myFunction(name) {
    this.name = name;

    alert( toString() ); // not working
    alert( this.toString() ); // not working either
};

myFunction.prototype.toString = function() {  
    return 'My name is ' + this.name;
};
-2
Christian 19 Авг 2014 в 19:02
Вам нужно вызвать myFunction с помощью new, иначе this не будет тем, чем должен быть. var func = new myFunction("foo"); console.log(func.toString());
 – 
Matt
19 Авг 2014 в 19:03
3
Второй работает. Просто сделай new myFunction('test').
 – 
Denys Séguret
19 Авг 2014 в 19:04
Я обновил свой код выше. Теперь я создаю экземпляр myFunction. Звонки по-прежнему не работают. Не могли бы вы предоставить в качестве ответа рабочий пример? Кстати: не понимаю голосов против! Еще никто не придумал очевидного и рабочего ответа !?
 – 
Christian
19 Авг 2014 в 20:28
@Matt: Конечно, ваш код будет работать. Вызов функции toString извне работает нормально! Как я могу использовать эту функцию внутри самого объекта.
 – 
Christian
19 Авг 2014 в 20:29

1 ответ

Лучший ответ

Вы создаете экземпляр myFunction и вызываете для него toString перед установкой прототипа.

Причина, по которой вы можете создать экземпляр myFunction даже до того, как объявите его, заключается в том, что он был поднял. Однако toString не поднимается и будет отображать [Объект объекта].

Решение - создать экземпляры после того, как вы полностью объявите объект.

Примечание. Функция-конструктор должна начинаться с заглавной буквы, поэтому это должна быть MyFunction, а не myFunction, и, возможно, дать ей имя, которое на самом деле означает что-то вроде Person или Animal, поскольку никто не поймет, что такое MyFunction. .

function myFunction(name) {
    this.name = name;
    //console.log is so much better than alert
    console.log('this is:',this,'this.toString:'
      , this.toString() );
};
myFunction.prototype.toString = function() {  
    return 'My name is ' + this.name;
};
var x = new myFunction('Hello World!');

Подробнее о прототипе здесь: Прототипное наследование - запись

1
Community 23 Май 2017 в 15:05
Привет, HMR. Да, в выводе консоли Firebug говорится, что toString не является функцией. Итак, какое было бы правильное и рабочее решение? Вы можете привести мне рабочий пример?
 – 
Christian
20 Авг 2014 в 10:41
Убери эту линию
 – 
HMR
20 Авг 2014 в 10:47
Тогда как и где мне вместо этого вызвать toString ()?
 – 
Christian
20 Авг 2014 в 12:28
Я ошибался с toString, вызывающим ошибку, поэтому, если вы сейчас не используете код, который вы не разместили в своем вопросе, происходит что-то странное. Я обновил свой ответ. Вы можете скопировать код и вставить его в консоль внизу, чтобы запустить.
 – 
HMR
20 Авг 2014 в 14:24
K, понял. Это устало. Если я использую МОЙ код выше, он не работает. Но когда я перемещаю строку var x = new myFunction('Hello World!') вниз, это работает. Есть идеи, почему?
 – 
Christian
20 Авг 2014 в 17:28