access-modifiers

0.0.4 • Public • Published

access-modifiers Build Status npm version

日本語で読みたい方はこちら => README_JP

Introduction

easy use private/protected field for ES2015 class syntax

We should have complicated implementations to achieve private/protected access modifiers for ES2015 because of it has no such features for class syntax.
This module reduces the complication of the implementation for access modifiers.

npm install access-modifiers

You can add --save or --save-dev option for your project needs.

⚠️Requirements

The module requires ES2015 Proxy.
You should use a polyfill like tvcutsem/harmony-reflect if your expecting environment is not support the native Proxy.

The module also requires Symbol implementation.
You can use a polyfill like medikoo/es6-symbol.
In addition, the module is well suited to class syntax. To use the class syntax, you can use Babel.

Usage (Node.js)

Animal.js

import AccessModifiers from "access-modifiers";
 
// the `create` method returns the objects for private and protected modifiers
const [_,p] = AccessModifiers.create();
 
class Animal{
  constructor(age){
    this[_.age]  = age;      // access to a private field
    this[p.name] = "Animal"; // access to a protected field
  }
 
  get age(){
    return this[_.age];
  }
 
  get name(){
    return this[p.name];
  }
 
  // restores the field information in a public method
  introduce(){
    return `Hello, my name is ${this.name}(age: ${this.age}).`;
  }
}
 
// finally, registers the objects for private and protected modifiers used on the Animal class
AccessModifiers.register([_,p], Animal);
 
export default Animal;

Gorilla.js

import AccessModifiers from "access-modifiers";
import Animal from "./Animal.js";
 
// you should give a base class to the `create` method for inheritance
const [_,p] = AccessModifiers.create(Animal);
 
class Gorilla extends Animal{
  constructor(age){
    super(age);
    this[_.like] = "Banana";  // access to a private field
    this[p.name] = "Gorilla"; // access to a protected field (overrides the Animal's field)
  }
 
  get like(){
    return this[_.like];
  }
 
  // overrides a public method (rewrite the protected `name` field used in the `super.introduce` method)
  introduce(){
    return `${super.introduce()} I like a ${this.like}.`;
  }
}
 
// finally, registers the objects for private and protected modifiers used on the Gorilla class
AccessModifiers.register([_,p], Gorilla);
 
export default Gorilla;

index.js

import "harmony-reflect"; // you do not have to this line if the native Proxy is supported
import Animal  from "./Animal.js";
import Gorilla from "./Gorilla.js";
 
const animal = new Animal(5);
console.log(animal.introduce()); // "Hello, my name is Animal(age: 5)."
animal.age = 10; // cannot set the value because the `age` is getter property
console.log(animal.age); // 5
 
const gorilla = new Gorilla(8);
console.log(gorilla.introduce()); // "Hello, my name is Gorilla(age: 8). I like a Banana."
 
// you can forcefully get the field values for Reflection
console.log(Object.getOwnPropertySymbols(gorilla)); // [symbol(name), symbol(age), symbol(like)]

Usage (Browsers supporting Proxy)

<!DOCTYPE html>
<html lang="ja">
  <head>
    <!-- ensure to load browser.min.js -->
    <script src="release/access-modifiers.browser.min.js"></script> 
    <script>
      // do same way
      const[_,p] = AccessModifier.create();
 
      class Animal{
        // implementation
      }
 
      AccessModifier.register([_,p]);
    </script> 
    <!-- ... -->
  </head>
  <body>
  </body>
</html>

Usage (Browsers not supporting Proxy)

You had better not to put a dummy Proxy

<!DOCTYPE html>
<html lang="ja">
  <head>
    <script src="release/access-modifiers.browser.min.js"></script> 
    <script>
      // define the name of private/protected members as Array to the 1st arg for the `create` method
      const [_,p] = AccessModifier.create([["age"],["name"]]);
 
      // do same way
      class Animal{
        // implementation
      }
 
      AccessModifier.register([_,p]);
    </script> 
    <!-- ... -->
  </head>
  <body>
  </body>
</html>

Readme

Keywords

none

Package Sidebar

Install

npm i access-modifiers

Weekly Downloads

1

Version

0.0.4

License

MIT

Last publish

Collaborators

  • gaogao_9