I would like to understand what will be the difference in JS if I will call a function from an OOP including "instance" before calling the key/instance inside.
EDIT after solved:
I need to use the class as singleton but as @VLAS answer below when you export the class as default and add new it will make it singleton automatically. here is the syntax:
class Person {
...
}
export default new Person() //this syntax should make it singleton
the code before the edit for the explain of my issue:
import Person from './personManager';
const person = new Person()
person.introduceSelf()
person.instance.introduceSelf()
I think its a syntax from ES5 that now in ES6 we are don't need any more? or there is something more complex that I didn't understand?
in our project we have this code I just added the personManager.js for the example:
syngletonSymbol.js
/* eslint-disable */
let SingletonSymbol;
if (!SingletonSymbol) {
SingletonSymbol = (function (Object) {
let ObjectPrototype = Object.prototype,
defineProperty = Object.defineProperty,
prefix = `__simbol${Math.random()}__`,
id = 0;
function get() { /* avoid set w/out get prob */ }
function SingletonSymbol() {
const __symbol__ = prefix + id++;
defineProperty(
ObjectPrototype,
this._ = __symbol__,
{
enumerable: false,
configurable: false,
get, // undefined
set(value) {
defineProperty(this, __symbol__, {
enumerable: false,
configurable: true,
writable: true,
value
});
}
}
);
}
defineProperty(SingletonSymbol.prototype, 'toString', {
enumerable: false,
configurable: false,
writable: false,
value: function toString() {
return this._;
}
});
return SingletonSymbol;
}(Object));
}
export default SingletonSymbol;
singleton.js
/* eslint-disable */
const SingletonSymbol = require('./singletonSymbol');
export default class Singleton {
static get instance() {
if (!this[SingletonSymbol]) {
this[SingletonSymbol] = new this();
}
return this[SingletonSymbol];
}
constructor() {
const Class = new.target ? new.target : this.constructor;
if (!Class[SingletonSymbol]) {
Class[SingletonSymbol] = this;
}
return Class[SingletonSymbol];
}
}
personManager.js
import Singleton from 'infrastructure/helpers/singleton';
class Person extends Singleton{
name;
constructor() {
super()
this.name = 'John';
this._init();
}
_init = () => {
this.name = 'Mario';
}
introduceSelf() {
console.log(`Hi! I'm ${this.name}`);
}
}
I will appreciate any answer that will help me to understand the idea and if all that singleton is something that is deprecated and can be deleted from my project