Skip to content

Macmee/private-scope

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Build Status

##What is this?

This module gives javacript objects a private only scope.

##Examples

Regular JavaScript objects:

require('private-scope');

const test = {
  getX: function() {
    return this.private.x;
  },
  setX: function(x) {
    this.private.x = x;
  }
};

test.private.x = 5; // TypeError: cannot find x of undefined
test.setX(100);
console.log(test.private.x); // TypeError: cannot find x of undefined
console.log(test.getX()); // 100

Classes:

require('private-scope');

class TestClass {
  getX() {
    return this.private.x;
  }
  setX(x) {
    this.private.x = x;
  }
  constructor() {
    this.private.y = 2;
  }
};

const test = new TestClass();
test.private.x = 5; // TypeError: cannot find x of undefined
test.setX(100);
console.log(test.private.x); // TypeError: cannot find x of undefined
console.log(test.getX()); // 100

Prototypes:

require('private-scope');

function TestClass() {
  this.private.y = 53;
}

TestClass.prototype.getX = function() {
  return this.private.x;
}

TestClass.prototype.setX = function(x) {
  this.private.x = x;
}

TestClass.prototype.getY = function() {
  return this.private.y;
}

const test = new TestClass();
test.private.x = 5; // TypeError: cannot find x of undefined
test.setX(100);
console.log(test.private.x); // TypeError: cannot find x of undefined
console.log(test.getX()); // 100
console.log(test.getY()); // 53

##Why?

Lets say you organized your object like so:

const test = {

  private: {},

  getX: function() {
    return this.private.x;
  },

  setX: function(x) {
    this.private.x = x;
  }

};

Sure you can do test.getX() and test.setX(12) here but you can just as easily do test.private.x and there’s nothing stopping you from doing the latter even outside of an internal function on test such as from within getX and setX. After you include this module into your project, test.private.x is not allowed.

##Are You Crazy?

Probably. And my solution isn't bulletproof. This solution leverages Function.caller behind the scenes so things can get funky when that's not available. I'm using a slight workaround for objects created via the class keyword too (stack inspection) to determine if a caller belongs to a class due to the absence of Function.caller in methods created using class.

About

Add private scope to javascript objects

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published