Показать сообщение отдельно
  #1 (permalink)  
Старый 29.04.2015, 16:30
Интересующийся
Посмотреть профиль Найти все сообщения от nondeterminism
 
Регистрация: 27.04.2015
Сообщений: 18

Множественное наследование в JS
У меня уже были попытки имплементации, но все они были не особо красивыми. Вот, наконец, получился вполне годный вариант. Это реализация на основе Proxy — фича, добавленная в es6. Этот вариант будет работать, пока, только в новых V8. Я проветял на ноде 0.11.14 с флагом --harmony

init={
 protos: [],
 appendProto: function(o){this.protos.push(o)},
 removeProto: function(o){this.protos=this.protos.filter(function(x){return x!==o})},
 get: function(proxy, msg){
  var result
  if(this[msg]) return this[msg]
  if(this.protos.some(function(o){return result=o[msg]})) return result
 }
}

createObject=function(){
 return Proxy.create(
  (function(){var o=Object.create(init); o.protos=[]; return o})()
 )
}

o1=createObject()
o2=createObject()
o1.appendProto({a: 1})
o1.appendProto({b: "foo"})
o1.appendProto({c: 100})
o2.appendProto({a: 10})
o2.appendProto({b: "bar"})
console.log(o1.a, o1.b, o1.c, o2.a, o2.b, o2.c) // 1 'foo' 100 10 'bar' undefined

o3=createObject()
o3.appendProto({another: 300})
o1.appendProto(o3) // добавляем в качестве прототипа "наш" объект
console.log(o1.another) // 300 bingo!!!


Версия сырая, конечно, надо допиливать. В частности,я не разобрался пока, как запилить сеттер для такого объекта. Но главное, видно, что в целом данный подход работает.

Последний раз редактировалось nondeterminism, 29.04.2015 в 21:23.
Ответить с цитированием