Цепочка наследования

246
07 ноября 2021, 05:20

Нужна помощь с реализацией такой вот задачи - функция должна принять массив функций и соединить их в цепочку наследования, после чего новый объект должен иметь доступ к методам переданных прототипов

const ExtendedSquare = chain(Square, Polygon, Shape);
Answer 1

Как-то так можно нахимичить:

function chain(...fs) { 
  var ps = fs.map(f => f.prototype) 
   
  fs.reverse() 
  ps.unshift(Object.create(null)) 
 
  function Res(...args) { 
    var me = Object.create(null) 
 
    for (var f of fs) { 
      Object.setPrototypeOf(me, f.prototype) 
      me = f.apply(me, args) || me 
    } 
     
    Object.setPrototypeOf(me, new.target.prototype) 
     
    return me 
  } 
 
  Res.prototype = new Proxy(ps[0], { 
    getOwnPropertyDescriptor(target, name) { 
      var res 
 
      for (var p of ps) { 
        if (res = Object.getOwnPropertyDescriptor(p, name) /* assignment */) { 
          break 
        } 
      } 
       
      return res 
    }, 
     
    ownKeys(target) { 
      return Array.from(new Set(ps.flatMap(p => [Object.getOwnPropertyNames(p), Object.getOwnPropertySymbols(p)]))) 
    }, 
     
    has(target, name) { 
      for (var p of ps) { 
        if (name in p) { 
          return true 
        } 
      } 
       
      return false 
    }, 
     
    get(target, name, receiver) { 
      for (var p of ps) { 
        if (Object.hasOwnProperty.call(p, name)) { 
          return p[name] 
        } 
      } 
       
      for (var p of ps) { 
        if (name in p) { 
          return p[name] 
        } 
      } 
    }, 
  }) 
 
  return Res; 
} 
 
function X(x) { this.x = x } 
X.prototype.getX = function () { return this.x } 
 
function Y(x, y) { this.y = y } 
Y.prototype.getY = function () { return this.y } 
 
function Z(x, y, z) { this.z = z } 
Z.prototype.getZ = function () { return this.z } 
 
var Q = chain(Z, Y, X) 
var obj = new Q(1, 2, 3) 
 
console.log(obj.x, obj.y, obj.z) 
console.log(obj.getX(), obj.getY(), obj.getZ()) 
 
console.log(obj + "") 
 
Y.prototype.toString = function () { return this.x + " " + this.y } 
console.log(obj + "") 
 
X.prototype.toString = function () { return this.x } 
console.log(obj + "") 
 
Z.prototype.toString = function () { return this.x + " " + this.y + " " + this.z } 
console.log(obj + "")

READ ALSO
Что означает запись, которая напоминает массив, но используется на месте имени константы

Что означает запись, которая напоминает массив, но используется на месте имени константы

Доброе утроНадо срочно разобраться в коде, а JavaScript только начинаю изучать

169
динамическое обновление страницы AJAX, JQuery

динамическое обновление страницы AJAX, JQuery

Есть два AJAX скрипта, один добавляет в БД, другой выводит из БД, они оба работают

169
Считать qr code из браузера телефона

Считать qr code из браузера телефона

Мне необходимо считать qr code c web страницы с телефона на Android, для этого решил написать страницу используя ReactJS, нашел библиотеку react-qr-reader, взял...

174