[js] private vars en methods

Pagina: 1
Acties:

  • Clay
  • Registratie: Oktober 1999
  • Laatst online: 25-02 11:17

Clay

cookie erbij?

Topicstarter
Een vriend vroeg me of het in js mogelijk was een object ook private methodes te geven (heette iets anders maar doet er ff niet toe). Het idee is dan om de object specifieke functies ook andere hulp functies te laten hebben, die je zelf niet handmatig kan aanroepen (ala obj.functie()).

Met wat zoekwerk heb ik wel wat kunnen vinden over "private" variabelen en functies voor objecten, en "privileged" object functies die deze kunnen gebruiken ala:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function myObject() {       
    this.a = 'value'; // public
    var b = 'value';  // private
    
    var self = this; // helper
    function melp() { // private
        alert(self.a +' '+b);
    }
        
    // public privileged
    this.woei = function() {
        melp();
    }   
    this.woei(); // test
}

new myObject();


Dat wist ik op zich wel. "melp" kan ik niet van buitenaf aanroepen, en ook die losse var is niet te achterhalen, maar als je dat op objectniveau zou uitbouwen zou je een object moeten definieren met alle object functies zoals "woei" hierboven, en dat is nou net de allertraagste (en imo sufste) manier om een object te definieren. Voor elke instantie van je object moet alles dan opnieuw opgebouwd worden.
Alleen zijn die private functies niet beschikbaar als je methodes aan je object hangt met prototyping.

Private of static variabelen zijn dan op zich wel te begruiken als je die truuk toepast. je zou dan met een set of get in de constructor je vars iig kunnen beschermen van rechtstreeks gepook van buitenaf, en dan de rest gewoon met prototyping doen, bijvoorbeeld:

JavaScript:
1
2
3
4
5
6
7
8
9
10
function myObject() {
    var privates = {
        member:'value',
        other:'something'
    }

    this.get = function(id) {
        return privates[id];
    }
}


Zodat je ook vanuit geprototypte functies die private variabelen op kan vragen middels een this.get(), Maar met functies krijg ik dit dus niet voor elkaar als ik het probeer te combineren met prototyping. Wat ik oa geprobeerd heb is een functie OM het prototypen van het object heen te hangen, als een soort Class, waarbinnen ik variabelen en functies definieer.
Dan heb ik alleen een ander probleem, namelijk dat die dingen die IN die functie maar BUITEN de prototypes staan gaan gelden voor de "class", en niet los per instantie van mijn object. zo kan je dus wel static variabelen maken, en ook private, maar wederom geen functies :D en bovendien loopt de hele scoping denk ik grandioos in de soep als ik met object overerving aan de slag ga.

Een heel verhaal :) en hopelijk iig een beetje duidelijk, maar mijn vraag is dus eigenlijk of iemand hier ueberhaupt ooit mee bezig is geweest, en een andere oplossing weet voor private en static dingen in js, anders dan privileged functies bouwen met je hele object als het ware in 1 grote functie. Op zich bestaan deze aspecten namelijk wel gewoon in js, maar je moet er erg veel moeite voor doen.

Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin


  • oh,when?
  • Registratie: April 2000
  • Niet online

oh,when?

...

Ik ben er wel mee bezig geweest ( zoals we het erover hebben gehad met ICQ ) maar heb het een beetje laten liggen vanwege 2 redenen:

- het idee van public / private functies en variables in een prototype based ( chain ) taal, waar het zo makkelijk is properties dynamisch toe te voegen, rammelt aan de flexibilteit van ECMAscript wat het juist zo populair maakt. In de proposal van ECMAscript 4 zijn ze er ook nog niet over uit hoe dit aan te pakken

- in dezelfde proposal wordt wel gesproken over volledig Class support met private en internal member types. Ergens hoop ik dat Flash 7 deze proposal deels zal ondersteunen, en aangezien ik toch meer met de Actionscript variant bezig ben dan met de Javascript variant zou ik hier al wat praktische voorbeelden mee kunnen maken.

:)

"You're only as good, as what you did last week."


  • Clay
  • Registratie: Oktober 1999
  • Laatst online: 25-02 11:17

Clay

cookie erbij?

Topicstarter
Dat het de flixibiliteit niet ten goede komt is idd waar. Maar aan de andere kant is het wel "netter" om gewoon private enz. dingen te hebben, zodat die ook niet "per ongeluk" door andere processen kunnen worden aangeroepen of gebruikt.

Dat ze zelf (eindelijk) classes willen integreren in ecma duidt daar op zich ook wel wat op :P Ik vraag me wel nog steeds af of het met de huidige ecma te simuleren is :) ook al zijn ze er nog niet uit hoe ze het officieel willen implementeren.

Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin