JavaScript: ошибка метода прототипа? - PullRequest
4 голосов
/ 05 февраля 2010

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

... запускается из этого бита:

Ответы [ 2 ]

3 голосов
/ 05 февраля 2010
// 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 голос
/ 05 февраля 2010

Вариант 1 кажется правильным. Я попробовал ваш код в ExecuteJS и пропустил 2. и 3. Это сработало (хотя я удалил вызов на console.log и изменил его на alert). TestFunc вызывается в пределах RealFunc.

Что произойдет, если вы удалите "use strict";?

...