JSFiddle - React, Tailwind, and code Playground

by Ilya

JavaScript

const props = {
  name: 'Abby',
  chat: 'the last of us. Part II',
  getChat() {
    this._privateMethod();
  },
  _privateMethod() {
    console.log(this._privateProp);
  },
  __privateMethodToo() {},
  _privateProp: 'Нельзя получить просто так',
};

const proxyProps = new Proxy(props, {
  get(target, prop, receiver) {
    if (prop.startsWith('_')) {
        throw new Error('Нет прав')
    } 
    
    if (typeof (target[prop]) === "function") { 
         return target[prop].bind(target);
       }
        return target[prop];
  },
  
  set(target, prop, val, receiver) {
    if (prop.startsWith('_')) {
      throw new Error('Нет прав');

    }
    
    target[prop] = val;
    return true;
  },
  
  deleteProperty(target, prop) {
    if (prop.startsWith('_')) {
      throw new Error('Нет прав');

    }
    
    target[prop] = val;
    return true;
  }
});

proxyProps.getChat();
delete proxyProps.chat;

proxyProps.newProp = 2;
console.log(proxyProps.newProp);

try {
	proxyProps._newPrivateProp = 'Super game';
} catch (error) {
	console.log(error);
}

try {
	delete proxyProps._privateProp;
} catch (error) {
	console.log(error); // Error: Нет прав
}

/*
	* Вывод в консоль следующий:
Нельзя получить просто так
2
Error: Нет прав
Error: Нет прав
*/