2015-06-25 3 views
0

Я надеюсь, что кто-то может помочь мне разобраться, как это сделать правильно, а не просто «заставить его работать».JavaScript: как вызвать функцию в свойстве прототипа, изнутри другой функции в свойстве прототипа, все внутри замыкания?

Я пытаюсь использовать объект внутри крышки, и имеющие проблемы сферы применения:

var Why = function() { 
    this.foo = 'bar'; 
} 
Why.prototype.explain = function() { 
    alert(this.foo); 
} 
Why.prototype.doIt = function() { 
    this.explain(); 
} 

(function() { 

    document.addEventListener("DOMContentLoaded", function(event) { 
     var why = new Why(); 
     why.doIt(); 
    }); 

})(); 

И я получаю в консоли:

Uncaught TypeError: this.explain is not a function 

Я мог бы использовать

Why.prototype.explain.call(); 

но это просто кажется неправильным, и когда я на самом деле делаю это ... this.foo в любом случае не определено,, так что это явно не правильный подход.

Если удалить функцию самостоятельного вызова следующим образом ...

var Why = function() { 
    this.foo = 'bar'; 
} 
Why.prototype.explain = function() { 
    console.log(this.foo); 
} 
Why.prototype.doIt = function() { 
    // Why.prototype.explain.call(); 
    this.explain(); 
} 

// (function() { 

    document.addEventListener("DOMContentLoaded", function(event) { 
     var why = new Why(); 
     why.doIt(); 
    }); 

// })(); 

то это работает, конечно, но:

, что мне не хватает и где/как я могу узнать его?

Заранее спасибо.

+2

простой: добавьте пол двоеточия после назначений, вы не поверите, что происходит ... – dandavis

ответ

2

Ваш код обрабатываются как

Why.prototype.doIt = function() { ... }(function() { ... }); 

Вы вызывающая функцию, которую вы хотите назначить на прототип, а затем назначить возвращаемое значение. Поскольку он возвращает undefined, Why.prototype.doIt не существует.

Вам нужна точка с запятой.

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