Javascript:ошибка метода прототипа?
-
18-09-2019 - |
Вопрос
Я получаю сообщение об ошибке «TestFunc не определен», когда этот фрагмент кода...
/* my_object.js */
"use strict";
function MyObject (param) {
this.param = param;
}
MyObject.prototype.TestFunc = function () {
console.log ('in TestFunc');
}
MyObject.prototype.RealFunc = function () {
// I have tried 3 different ways to call TestFunc:
// 1.
this.TestFunc ();
// 2.
TestFunc ();
// 3. (I didn't really think this would work,
// but thought it was worth a try...)
MyObject.TestFunc ();
}
... запускается из этого фрагмента кода:
/* index.js */
var myObj = new MyObject ('test');
myObj.RealFunc (); // Firebug: "TestFunc is not defined"
Решение
// 1.
this.TestFunc ();
Это нормально.Это сработает, если удалить другие вызовы.
(Ну, это работает до тех пор, пока вы не отклеите RealFunc
от его владельца и называть его самостоятельно, например var method= myObj.RealFunc; method();
или через обработчик событий или тайм-аут.В таком случае this
в RealFunc не будет экземпляром MyObject, и вам нужно будет посмотреть замыкания или Function.bind
чтобы заставить его работать.)
// 2.
TestFunc ();
Нет, TestFunc не определен как переменная в локальной или глобальной области.Это вызывает ошибку, которую вы получаете от Firebug.
// 3. (I didn't really think this would work,
// but thought it was worth a try...)
MyObject.TestFunc ();
Нет, ты был прав.:-) Это было бы MyObject.prototype.TestFunc.call(this)
, сделано явно.
JavaScript в некоторой степени запутывает дело, помещая в стандартные функции-конструкторы встроенных объектов одни и те же методы, что и в их прототипы (например, String.split
существует там, где действительно только String.prototype.split
должен).Но этого не произойдет с вашими собственными объектами, если вы явно не скажете что-то вроде MyObject.TextFunc= MyObject.prototype.TextFunc
.
Другие советы
Вариант 1 кажется верным.Я попробовал ваш код в ExecuteJS и пропустил 2.и 3. это сработало (хотя я удалил вызов console.log
и изменил его на alert
). TestFunc
вызывается внутри RealFunc
.
Что будет, если удалить "use strict";
?