🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.php
Article #231927

Re: Nikomu niepotrzebne zmienne prywatne?

#231927
From: Marek S
Date: Sat, 27 Jan 2018 12:24
96 lines
3875 bytes
W dniu 26-01-2018 o 23:22, Roman Tyczka pisze:

>> Czegoś takiego w klasach JS nie ma.
> 
> Dopiero raczkuję w JS, ale jeśli rzeczywiście nie ma pól prywatnych
> (property znam z Delphi i z czymś ciutkę innym mi się kojarzą) 

W nomenklaturze JS zmienne jako cechy obiektów lub też quasiobiektów to 
właściwości:

https://www.w3schools.com/js/js_properties.asp

Jest też gotowa metoda do ich tworzenia zawierająca "properties" w nazwie:

https://developer.mozilla.org/pl/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

> to w ogóle
> nie ma mowy o pełnej obiektowości, bo wszak obiekt to zbiór pól z danymi i
> metod do operowania na nich, dzięki czemu uzyskuje się jedną z
> fundamentalnych cech OOP czyli enkapsulację. Bez prywatności nie ma
> enkapsulacji, bo pola mogą być zmieniane poza logiką obiektu, a to prowadzi
> do nieprzewidzianych sytuacji.

O tym właśnie piszę. Zarówno standard JS (przynajmniej bieżący ECMA6) 
jak i programiści uważają właściwości prywatne chyba jako oldschoolowe. 
JS od dawna ogranicza się jedynie do rezerwacji słów kluczowych typu 
private czy protected ale nic z tym nie robi. Programiści JS, jak wynika 
z moich dyskusji, dziwią się, że coś takiego chcę używać.

Dla Twojej informacji: daje się symulować właściwości prywatne w klasach 
ale wymaga to łamańców. W Googlach grzebałem ze 2 dni i nigdzie 
przykładu poniższego nie znalazłem. Ja wykorzystuję do tego zmienne o 
zasięgu bloku, które deklaruje się słowem kluczowym let (nie var). 
Wykorzystuję też to, że klasę można rozszerzać nie tylko inną klasą, ale 
również - uwaga - wynikiem działania funkcji!!! Trzecia rzecz, korzystam 
z tzw słabych map lub symboli bo w JS właściwość nie musi być aresowana 
stringiem, ale również .... obiektem!

Dopiero taki burdel w kodzie utworzy zmienną prywatną:

let aClass = (function () {
	let a = Symbol("a");

	class aClass {
		readFromA() {
			console.log(this[a], this.b);
		}

		constructor() {
			this[a] = "aaa"; //this is private
			this.b = "bbb"; // this is public
		}

	}

	return aClass;
})();

let bClass = (function () {
	let a = Symbol("a");

	class bClass extends aClass {

		readFromB() {
			console.log("B", this[a], this.b);

		}

		constructor() {
			super();
			this[a] = "ccc"; //this is private
			this.b = "ddd"; // this is public
		}

	}

	return bClass;
})();



let bc = new bClass();
bc.readFromA(); // aaa ddd
bc.readFromB(); // ccc ddd


Wyrażenie "extends aClass" rozszerza klasę bClass o wynik działania 
funkcji anonimowej, który jest przechowywany w zmiennej sugerującej, że 
to klasa aClass a nie zmienna. Funkcja anonimowa zwraca natomiast 
deklarację tak samo nazwanej klasy: czyli aClass.

Super, co?

-- 
Pozdrawiam,
Marek
Technical Details
Message-ID: <p4hr1e$bvl$1@node2.news.atman.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!.POSTED!not-for-mail
References: <p4dakb$a6j$1@node2.news.atman.pl> <1fz90to1qzf67.dlg@tyczka.com> <p4do0k$drj$1@node1.news.atman.pl> <1j1wsv7x3pigv.dlg@tyczka.com>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!.POSTED!not-for-mail
From: Marek S <precz@spamowi.com>
Newsgroups: pl.comp.lang.php
Subject: Re: Nikomu niepotrzebne zmienne prywatne?
Date: Sat, 27 Jan 2018 13:24:08 +0100
Organization: ATMAN - ATM S.A.
Lines: 96
Message-ID: <p4hr1e$bvl$1@node2.news.atman.pl>
References: <p4dakb$a6j$1@node2.news.atman.pl> <1fz90to1qzf67.dlg@tyczka.com> <p4do0k$drj$1@node1.news.atman.pl> <1j1wsv7x3pigv.dlg@tyczka.com>
NNTP-Posting-Host: 89-69-207-111.dynamic.chello.pl
Mime-Version: 1.0
X-Trace: node2.news.atman.pl 1517055854 12277 89.69.207.111 (27 Jan 2018 12:24:14 GMT)
X-Complaints-To: usenet@atman.pl
NNTP-Posting-Date: Sat, 27 Jan 2018 12:24:14 +0000 (UTC)
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.5.2
In-Reply-To: <1j1wsv7x3pigv.dlg@tyczka.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit