JavaScript Encapsulation


1
Здравейте!
Първо се извинявам, ако има вече съществуваща тема, но не успях да намеря. Интересува ме как се енкапсулират данни в javascript. Направих си една private и една public функция, така, че private функцията да може да извиква тази, която е public и обратното. Уж работи добре, но бихте ли ми казали, дали е правилно така както съм го направил и някакви препоръки, ако не е.
Source: http://pastebin.com/pML2C0C7
Благодаря предварително!
Поздрави!



Отговори



2
Здравей колега,
по принцип в javascript много трудно се енкапсулират данни. И начинът е точно използвайки functuion scope-a.
По принцип съм чувал, че не е много хубаво да се енкапсулират данни в javascript (може и да бъркам)
Можеш ли да кажеш защо ти трябва да ги скриваш ?

от tddhome (3086 точки)


0
Нищо конкретно. Просто искам да се науча как става от хора, които разбират повече javascript от мен. :)



4

Здравей, колега. До колкото си спомням на лекцията Сложни функции ООП срещата на Училищната академия, Дончо когато спомена за closure-ите и по точно тяхното предназначение, обясни, че едно от основните неща, които можем да правим с тях, е точно да правим променливите private (data hiding). Идеята е като си направиш едно IIFE от него да върнеш в обект само пропертитата, които ще са достъпни (public), всичко друго след като не го връщаш остава private.

- Поздрави, Веско.




1

Здравей колега,

Според мен това, което ти трябва е т.нар. "Closure".

Дефинираш си един модул, който в твоя случай се казва ObjectCopier и в него слагаш private функцийките copyArray и deepCopy.

След това единственото, което трябва да направиш е да кажеш на модула да връща твоите private функции, така че да ги направи public:

Ето твоят код, преправен да функционира като модул с private и public функции:

http://pastebin.com/Ymd7aWfL

Надявам се да съм бил полезен :)

Cheers :)


от CaptCortez (1242 точки)


0
Благодаря за отговора, колега, но при твоя код, след като създадем инстанция на обекта ObjectCopier и двата метода се виждат и могат да се викат отвън.


0
Ами аз помислих, че това имаш предвид :) Ти можеш да си кажеш на модула кои функции да са му прайвит и кои да са публик, като сложиш тези, които искаш да са ти публични в return {}. Примерно ако искаш само deepCopy да е публична слагаш само нея:
return { deepCopy: deepCopy }
Така като инстанцираш ObjectCopier, след това можеш да достъпваш само ObjectCopier.deepCopy

от CaptCortez (1242 точки)