Proxy classes are intended to increase object creation speed.
For example you want to create an object of the class where a lot of another classes are created in the constructor via dependency injection. Maybe you won't use those classes but they are created and some of them can take some time to be created.
To avoid such a scenario Proxy objects exists. The proxy object completely replaces the constructor of the proxied object, and does not make a parent::__construct call. In this way you avoid creation all the classes in the constructor.
Instead Proxy objects have constructor with three parameters
public function __construct(\Magento\Framework\ObjectManagerInterface $objectManager, $instanceName = '\\Pulsestorm\\TutorialProxy1\\Model\\SlowLoading', $shared = true)
$this->_objectManager = $objectManager;
$this->_instanceName = $instanceName;
$this->_isShared = $shared;
The first is an object manager instance, the second is the name of the class this object proxies, and the third is a shared argument.
So, by replacing the entire constructor, we avoid any slow loading behavior.
Each method of original object is override by proxy object. Just string
$this->_getSubject() is added that create instance of original object! In this way you call constructor of original object only when it's needed. Something like lazy loading.
Recommend you to read excellent post about proxy objects