https://github.com/kbravh/multi-class
Easy multiple inheritance and composition in JavaScript.
https://github.com/kbravh/multi-class
classes composition inheritance object-oriented-programming oop
Last synced: 6 months ago
JSON representation
Easy multiple inheritance and composition in JavaScript.
- Host: GitHub
- URL: https://github.com/kbravh/multi-class
- Owner: kbravh
- License: mit
- Created: 2020-08-02T22:08:08.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2020-11-11T16:17:33.000Z (about 5 years ago)
- Last Synced: 2025-05-08T05:54:17.108Z (6 months ago)
- Topics: classes, composition, inheritance, object-oriented-programming, oop
- Language: JavaScript
- Homepage:
- Size: 58.6 KB
- Stars: 7
- Watchers: 1
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
[![Issues][issues-shield]][issues-url]
[![MIT License][license-shield]][license-url]
[![LinkedIn][linkedin-shield]][linkedin-url]
![CircleCI][circle-ci]
MULTI-CLASS
Easy multiple inheritance and composition in JavaScript.
Report a Bug
ยท
Request a Feature
## Table of Contents
* [About the Project](#about-the-project)
* [Getting Started](#getting-started)
* [Installation](#installation)
* [Usage](#usage)
* [Roadmap](#roadmap)
* [Contributing](#contributing)
* [License](#license)
* [Contact](#contact)
## About The Project
Multi-inheritance/composition is a very useful feature of Object Oriented Programming, but JavaScript's `Class` syntactic sugar does not allow for extending multiple parent classes. This library provides an easy way to solve that, without the need for mixin chains or functions.
## Getting Started
This library has zero dependencies. To get up and running in your project, just go ahead and install.
### Installation
Install the library with
``` bash
npm install @kbravh/multi-class
```
or
``` bash
yarn add @kbravh/multi-class
```
## Usage
Import the library, then create a couple of parent classes. A common pattern uses "Has" or "With".
``` JS
const multiclass = require('@kbravh/multi-class')
class HasName {
constructor({name}){
this.name = name
}
}
class HasAge {
constructor({age}){
this.age = age
}
}
```
Then, create your subclass and extend the parent classes using the `multi-class` function.
``` JS
class Person extends multiclass(HasName, HasAge){
// The constructor is called implicitly
getNameAndAge(){
return `${this.name} is ${this.age} years old.`
}
}
```
Finally, create an instance of your new class and see the magic!
``` JS
let person = new Person({
age: 22,
name: "Leeloo"
})
person.getNameAndAge() // Leeloo is 22 years old.
```
**Nota bene:** If your parent classes have different parameters for their respective constructors, an easy way to handle this is by passing in all arguments in a JSON object and destructuring them in the constructors, as is done above.
### Options
Don't like the name `multiclass`? Just change the name on import and inherit to your heart's content.
``` JS
const ๐ค = require('@kbravh/multi-class')
class Person extends ๐ค(HasName, HasAge){...}
```
## Roadmap
See the [open issues](https://github.com/kbravh/multi-class/issues) for a list of proposed features (and known issues).
## Contributing
Contributions are what make the open source community such an amazing place to be learn, inspire, and create. Any contributions you make are **greatly appreciated**.
1. Fork the Project
2. Create your Feature Branch (`git checkout -b new-feature`)
3. Be sure to run linting! (`yarn lint`)
4. Commit your Changes (`git commit -m 'Add something cool!'`)
5. Push to the Branch (`git push origin new-feature`)
6. Open a Pull Request
## License
Distributed under the MIT License. See [`LICENSE`](LICENSE) for more information.
## Contact
Karey Higuera - [@kbravh](https://twitter.com/kbravh) - karey.higuera@gmail.com
Project Link: [https://github.com/kbravh/multi-class](https://github.com/kbravh/multi-class)
[issues-shield]: https://img.shields.io/github/issues/kbravh/multi-class.svg?style=flat-square
[issues-url]: https://github.com/kbravh/multi-class/issues
[license-shield]: https://img.shields.io/github/license/kbravh/multi-class.svg?style=flat-square
[license-url]: https://github.com/kbravh/multi-class/blob/master/LICENSE
[linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=flat-square&logo=linkedin&colorB=555
[linkedin-url]: https://linkedin.com/in/kbravh
[circle-ci]: https://img.shields.io/circleci/build/github/kbravh/multi-class/master?style=flat-square&token=7a06dc52baa780c631a04b7dd09e358fa3f6b44d