Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Множественное наследование в JS (https://javascript.ru/forum/misc/55479-mnozhestvennoe-nasledovanie-v-js.html)

nondeterminism 29.04.2015 16:30

Множественное наследование в 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!!!


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

vasa_c 29.04.2015 18:25

Чем этот вариант красивее и годней, например, миксинов?

nondeterminism 29.04.2015 18:37

vasa_c,
Миксины -- это вообще говно, засирающее память и ломающее архитектуру, я обсуждать эту тему даже не хочу, в силу ее самоочевидности, как бы.

Erolast 29.04.2015 20:30

Цитата:

фича, добавленная в es5
которая будет добавленна в es6

Цитата:

Proxy.create
Это старый deprecated подход, в новых драфтах стандарта прокси выглядят так и поддерживаются в файрфоксе. На 2ality есть годная статья о них - http://www.2ality.com/2014/12/es6-proxies.html

Erolast 29.04.2015 20:31

Цитата:

Миксины -- это вообще говно, засирающее память и ломающее архитектуру, я обсуждать эту тему даже не хочу, в силу ее самоочевидности, как бы.
Аргументы? Нет никакой очевидности.

nondeterminism 29.04.2015 20:34

Цитата:

Сообщение от Erolast
Это старый deprecated подход, в новых драфтах стандарта прокси выглядят так и поддерживаются в файрфокс

Тогда почему в новых нодах именно такой синтаксис?

nondeterminism 29.04.2015 20:53

Цитата:

Сообщение от Erolast
Аргументы

Если ты насчет первого будешь спорить, то это вообще феерический lol, учи матчасть. По поводу второго, кратко
Object.prototype.extend=function(src){
 for(var i in src) {
   if(!src.hasOwnProperty(i)) return this;  this[i]=src[i]
  }
  return this
}

Main=function(){}
Main.prototype={a: 1}
A=function(){}
A.prototype=Object.create(Main.prototype)
B=function(){}
B.prototype=Object.create(Main.prototype)
//A и B унаследовали от Main
Another=function(){}
Another.prototype={anotherProp: 10}
// тут я хочу чтобы A унаследовал от Another
A.prototype.extend(Another.prototype)


alert(new A().anotherProp) //>>>> 10
Another.prototype.anotherProp=100
alert(new A().anotherProp) //>>>> 10 WTF?

nondeterminism 29.04.2015 21:09

Цитата:

Сообщение от Erolast
Нет никакой очевидности.

Для жава-господ нет очевидности, да, они на это не учились. Они по привадпротектед больше специалисты. Еще любят класс-ко-ко-ко икзымпляр-ко-ко-ко.

vasa_c 29.04.2015 22:59

Цитата:

Сообщение от nondeterminism (Сообщение 368733)
vasa_c,
Миксины -- это вообще говно, засирающее память и ломающее архитектуру, я обсуждать эту тему даже не хочу, в силу ее самоочевидности, как бы.

А, пардон, не признал...

Erolast 30.04.2015 08:06

Цитата:

Тогда почему в новых нодах именно такой синтаксис?
Потому что V8 до сих пор не заимплементил новый.


Часовой пояс GMT +3, время: 00:52.