oop - Encapsulation / Data Hiding in Javascript? -


i understand concept of encapsulation in javascript, , how make properties , methods public or private.

i'm playing around example:

    var person = function(newname, newage) {      // private variables / properties     var name = newname;     var age = newage;      // public methods     this.getname = function() {         return name;     }      // private methods     var getage = function() {         return age;     }      // public method, has acces private methods     this.giveage = function() {         return getage();     } }  var jack = new person("jack", 30);  console.log(jack.name); // undefined console.log(jack.getname); // jack console.log(jack.getage()); // typeerror: jack.getage not function console.log(jack.getage); // undefined console.log(jack.giveage()); // 30 

so, variables var name , var age private. access them use public methods using .this reference. var inside function private, , that's .this inside object visible outside.

i guess that's cause person visible, exposes of properties.

am on right track? right way hide or expose properties / methods?

and 1 more question, why console.log(jack.getage()); throws error? , when referencing functions "stored" in variables, should put () @ end of function, works both ways, don't know use?

thanks!

i guess that's cause person visible, exposes of properties.

correct.

am on right track? right way hide or expose properties / methods?

if want it, yes, standard way it. there's @ least 1 other way of es2015, (probably) more overhead.

and 1 more question, why console.log(jack.getage()); throws error?

because jack object doesn't have getage property, jack.getage yields undefined, isn't function. there's getage variable inside context giveage closure has access (along age , name), jack doesn't have getage property.

and when referencing functions "stored" in variables, should put () @ end of function, works both ways, don't know use?

no, doesn't work both ways. jack.getname gets reference function. jack.getname() calls function , gets return value.

i should note there's no point getage function. it's accessible closures defined within person function, age , name are. use getage use age instead , avoid function call.


just completeness, i'll note many people don't worry private properties in javascript, opting instead "private convention" — e.g., use naming convention (such names starting _) mean "don't touch these, they're private." doesn't prevent people using them, of course, indicates shouldn't. folks advocating point out in many languages "true" private properties/fields (java, c#), properties/fields accessible small amount of effort via reflection. , so, argument goes, using naming convention "as private."

i'm not agreeing (nor particularly disagreeing) that, require rather more work in java or c# access private properties public ones. i'm noting "private convention" approach quite common, , "good enough."


Comments

Popular posts from this blog

sublimetext3 - what keyboard shortcut is to comment/uncomment for this script tag in sublime -

java - No use of nillable="0" in SOAP Webservice -

ubuntu - Laravel 5.2 quickstart guide gives Not Found Error -