Вопрос

Я получаю сообщение об ошибке «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";?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top