Article View: pl.comp.lang.php
Article #231927Re: Nikomu niepotrzebne zmienne prywatne?
From: Marek S
Date: Sat, 27 Jan 2018 12:24
Date: Sat, 27 Jan 2018 12:24
96 lines
3875 bytes
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-mailReferences:
<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