2010-02-05 2 views
4

Я получаю "TestFunc не определен" ошибка, когда этот бит кода ...Javascript: ошибка метода прототипа?

/* 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

Я пробовал в firebug только с этим. TestFunc() 'и другие два закомментировали, он отлично работает. Попробуй еще раз. –

ответ

3
// 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.

+0

ах ха! я не включил его в приведенную выше упрощенную версию, так как я полностью забыл о том, что происходит с «этим» в обработчике событий, но RealFunc() действительно является обработчиком событий ... –

+0

Да, я подозревал, что ... way method-binding и 'this' работает в JavaScript, очень странно по сравнению с другими языками программирования; это, вероятно, самый распространенный вопрос. – bobince

1

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

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

+0

ECMAScript Fitth Edition 'use strict' ничего не сделает ... пока. Я с нетерпением жду, когда браузеры будут выпущены там, где они есть! – bobince

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