🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

2 total messages Started by Marek S Sat, 20 Jan 2018 15:34
Co się stało z programowaniem obiektowym w JS?
#408621
Author: Marek S
Date: Sat, 20 Jan 2018 15:34
77 lines
2866 bytes
Witam,

Kiedyś zrobiłem spory projekt w JS, który jakiś czas temu przestał 
działać. Postanowiłem przyjrzeć się sprawie. Okazało się, że styl 
programowania "obiektowego" jaki używałem przestał działać. Przykład 
poniżej.

Funkcje prywatne (f1, f2) kiedyś definiowało się wewnątrz innej funkcji. 
Funkcje mogły się wzajemnie wywoływać zachowując kontekst obiektu 
(testClass). Wszystko pięknie działało lata ... i przestało nagle 
(sprawdzałem Edge, Firefox).

W poniższym przykładzie kliknięcie przycisków "test" i "test2" powoduje, 
że zadziałają funkcje odpowiednio f1 (prywatna) i f3 (publiczna). 
Natomiast wywołanie z ich poziomu innej funkcji prywatnej (f2) powoduje, 
że traci ona kontekst obiektu (testClass). Jej operator this wskazuje na 
obiekt Window!!! Funkcja f2 traktowana jest tak jakby była poza klasą 
testClass. Mało tego, analizując inny przypadek, this stał się nawet 
"undefined". Zawsze chodzi o to samo: wywołanie jakiejś prywatnej 
funkcji w obiekcie z poziomu innej - przestało być możliwe z zachowanie 
kontekstu.

Przykład zacznie działać gdy zamiast wywoływać f2(), wywołam 
f2.bind(this)().

Co się stało, że powszechnie stosowane metody nagle padły? Czy da się to 
jakoś przywrócić do życia bez przerabiania tysięcy linii kodu?


<!doctype html>
<html>
<head>
<meta charset="utf-8">
<script>
var tc;
	
function testClass()
	{
	function f2()
		{
		console.log("f2",this===tc);
		}

	function f1()
		{
		console.log("f1",this===tc);
		f2();
		}
		
	this.f3=function()
		{
		console.log("f3",this===tc);
		f2();
		}
		
	document.getElementById("test").addEventListener("click",f1.bind(this))
	}

function init()
	{
	tc=new testClass();
	}
	
window.addEventListener("load",init);	
	
</script>
</head>

<body>
<button type="button" id="test">test</button>
<button type="button" onClick="tc.f3()">test 2</button>
</body>
</html>

-- 
Pozdrawiam,
Marek
Re: Co się stało z programowaniem obiektowym w JS?
#408622
Author: Marek S
Date: Sat, 20 Jan 2018 20:36
8 lines
1225 bytes
Już mniej więcej wiem o co chodzi. Otóż operator this zachowuje się 
jakby "strict mode" był włączony chociaż nie jest. Dotyczy to wyłącznie 
funkcji wołanej przez inną funkcję w ramach jednego obiektu. Chyba nie 
ma wyjścia i trzeba całość kodu przepisać do wersji "strict" :-(

-- 
Pozdrawiam,
Marek
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads