2015-05-17 9 views
12

Mam problemy z prototypami, aby lepiej zrozumieć, jak działają. Nie mogę zrozumieć dlaczego nie mogę nazwać hideHeader, natomiast mam dostępu do zmiennej (this.header.el)Zrozumienie prototypów JavaScript

function App() { 
    this.init(); 
    this.el = document.getElementById('box'); 
} 

App.prototype.init = function() { 
    document.write('hello world'); 

    this.header = new Header(); 

    this.header.hideHeader(); 
    this.header.el.style.display = 'none'; 
}; 

new App(); 

function Header() { 
    this.el = document.getElementById('header'); 
} 

Header.prototype.hideHeader = function() { 
    this.el.style.display = 'none'; 
} 
+2

Obserwuj, co dzieje się podczas przesuwania wywołanie 'app()' na dole, a także zwrócić uwagę, że 'document.write' nadpisuje dokument – adeneo

Odpowiedz

8

Należy uporządkować swój kod tak, że zdefiniowaćhideHeader zanim spróbujesz przywołaj to.

Jak to:

function App() { 
    this.init(); 
    this.el = document.getElementById('box'); 
} 

function Header() { 
    this.el = document.getElementById('header'); 
} 

Header.prototype.hideHeader = function() { 
    this.el.style.display = 'none'; 
} 

App.prototype.init = function() { 
    document.write('hello world'); 

    this.header = new Header(); 

    this.header.hideHeader(); 
    this.header.el.style.display = 'none'; 
}; 

new App(); 

JavaScript jest językiem interpretowanym, to nie jest skompilowany. Jest oceniany sekwencyjnie, ponieważ jest ładowany do pamięci.

+9

Jest to spowodowane Funkcja hoisting - 'Heder' jest podniesiony, ale nie' hideHeader'. –

+0

Myślę, że teraz widzę, dziękuję za pomoc! – Alex

+0

Jestem szczęśliwy, aby pomóc. Myślę, że powinieneś zdefiniować init jako część funkcji App, a nie w prototypie. Myślę, że to sprawi, że twój kod będzie trochę czystszy. –

3

Trzeba tylko zmienić kolejność wykonywania czynności. Na przykład:

function App() { 
 
    this.init(); 
 
    this.el = document.getElementById('box'); 
 
} 
 

 

 
function Header() { 
 
    this.el = document.getElementById('header'); 
 
} 
 

 
Header.prototype.hideHeader = function() { 
 
    this.el.style.display = 'none'; 
 
} 
 

 
App.prototype.init = function() { 
 
    document.write('hello world'); 
 

 
    this.header = new Header(); 
 

 
    this.header.hideHeader(); 
 
    this.header.el.style.display = 'none'; 
 
}; 
 

 
new App();
<div id="header"></div> 
 
<div id="box"></div>

Powiązane problemy