Тема: Promise.race() копіює аргументи не так, як треба
В мене була ідея погратись з промісами.
Я б хтів симулювати гоночки. 
Нехай у нас є 10 машинок, котрі змагаються одна з одною, і коли якась машинка фінішує, я б хтів знати, яка саме машинка це зробила.
Для цього я створив клас, що наслідується від класу Promise. Ідея була проста - створити 10 екземплярів мого класу, при ініцілізації передавати в кожен клас
1. Функцію, котра б далі передавалась в конструктор Promise через виклик super
2. Унікальне ім'я, котре б прикріплювалось до властивості з ім'ям name
Після чого я б передавав ці десять класів в метод race(), і коли б ми мали переможця, то й б просто виводив їм'я цього переможця.
Але виявилось так, що коли я передаю 10 класів в метод race(), то воно їх копіює, при цьому властивість name втрачається! До речі, коли метод race() повертає значення, то це значення теж являється копією мого класу, котра не має властивості з ім'ям name.
Чому це так, і як це можна вирішити?
Я це зміг вирішити, але таким кривеньким способом, що якось аж фі. Хотілося б красивішого вирішення. Озьдо кід і посилання на jsfiddle https://jsfiddle.net/eosrcvxv/
function getFunc(name="def_name"){
     let func = function(resolve, reject)
  {    
    let f = function()
    {
      let r = Math.floor(Math.random()*100)+1;
      if(r!=55)
      {
        setTimeout( function(){ f(); }, 20 );
      }
      else
      {
        resolve("won! "+func.n);
      }
    }  
    f();
  };
  func.n=name;
  return func;
};
class MyP extends Promise {
  constructor(func)
  {
      super(func);
    //console.log("MyP: "+MyP.count++);
   //console.log("instanceof "+(this instanceof MyP));
  }
  
  success(resolve, reject)
  {
      return this.then((val)=>{console.log("val: "+val);}, reject);
  }
}
MyP.count=0;
let a = [];
for(let i = 0; i<10; i++)
{
    let p = new MyP(getFunc("p"+i));
  p.name="p"+i;
  a.push(p);
}
//console.log("hr");
    let p = MyP.race(a);
 // console.log("is p instance of MyP? "+(p instanceof MyP));
    p.success();