JSFiddle - React, Tailwind, and code Playground

JavaScript

var Warrior = {};

Warrior.warInit = function (weapon){
   this.setWeapon(weapon);    
}
 
Warrior.getWeapon = function(){
   return this.weapon;
}

Warrior.setWeapon = function (value){
   this.weapon = value || "Bare hands";
}

var Archer = Object.create(Warrior);

Archer.archInit = function (accuracy){
   this.setWeapon("Bow");   
   this.setAccuracy(accuracy); 
}

Archer.getAccuracy = function () {
   var pocket = arguments[arguments.length -1]; 
   
   return pocket.accuracy;
}
Archer.setAccuracy = function (value){  
   var pocket = arguments[arguments.length -1];
   
   pocket.accuracy = value;
}

var AdvancedArcher = Object.create(Archer);

AdvancedArcher.advInit = function(range, accuracy){ 
    this.archInit(accuracy);
    this.setShotRange(range);
}
AdvancedArcher.setShotRange = function(val){
    this.shotRange = val;
}

function attachPocketGen(warriorType){
   
   var funcsForPocket = Array.prototype.slice.call(arguments,1); // Take functions that need pocket
   var len = funcsForPocket.length;
   
   var pocket = {};
   var archer = Object.create(warriorType); // Linking prototype chain
   
   for (var i = 0; i < len; i++){ // You could use ES6 "let" here instead of IEFE below, for same effect
      (function(){  
         var func = funcsForPocket[i]; 
         archer[func] = function(){ 
             var args = Array.prototype.slice.call(arguments);
             args = args.concat([pocket]); // appending pocket to args

             return warriorType[func].apply(this, args);
         }
      })()
   }
   
   return archer;
}



var archer1 = attachPocketGen(AdvancedArcher,"getAccuracy","setAccuracy");  

archer1.advInit("11","accuracy high"); // 
console.log(archer1.getAccuracy()); // "accuracy high";

archer1.setAccuracy("accuracy medium");
console.log(archer1.getAccuracy());
console.log(archer1.shotRange)