Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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.
Ответить с цитированием
  #2 (permalink)  
Старый 29.04.2015, 18:25
Аватар для vasa_c
Профессор
Отправить личное сообщение для vasa_c Посмотреть профиль Найти все сообщения от vasa_c
 
Регистрация: 12.03.2008
Сообщений: 183

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

vasa_c,
Миксины -- это вообще говно, засирающее память и ломающее архитектуру, я обсуждать эту тему даже не хочу, в силу ее самоочевидности, как бы.
Ответить с цитированием
  #4 (permalink)  
Старый 29.04.2015, 20:30
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

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

Цитата:
Proxy.create
Это старый deprecated подход, в новых драфтах стандарта прокси выглядят так и поддерживаются в файрфоксе. На 2ality есть годная статья о них - http://www.2ality.com/2014/12/es6-proxies.html
Ответить с цитированием
  #5 (permalink)  
Старый 29.04.2015, 20:31
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Цитата:
Миксины -- это вообще говно, засирающее память и ломающее архитектуру, я обсуждать эту тему даже не хочу, в силу ее самоочевидности, как бы.
Аргументы? Нет никакой очевидности.
Ответить с цитированием
  #6 (permalink)  
Старый 29.04.2015, 20:34
Интересующийся
Посмотреть профиль Найти все сообщения от nondeterminism
 
Регистрация: 27.04.2015
Сообщений: 18

Сообщение от Erolast
Это старый deprecated подход, в новых драфтах стандарта прокси выглядят так и поддерживаются в файрфокс
Тогда почему в новых нодах именно такой синтаксис?
Ответить с цитированием
  #7 (permalink)  
Старый 29.04.2015, 20:53
Интересующийся
Посмотреть профиль Найти все сообщения от nondeterminism
 
Регистрация: 27.04.2015
Сообщений: 18

Сообщение от 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?
Ответить с цитированием
  #8 (permalink)  
Старый 29.04.2015, 21:09
Интересующийся
Посмотреть профиль Найти все сообщения от nondeterminism
 
Регистрация: 27.04.2015
Сообщений: 18

Сообщение от Erolast
Нет никакой очевидности.
Для жава-господ нет очевидности, да, они на это не учились. Они по привадпротектед больше специалисты. Еще любят класс-ко-ко-ко икзымпляр-ко-ко-ко.
Ответить с цитированием
  #9 (permalink)  
Старый 29.04.2015, 22:59
Аватар для vasa_c
Профессор
Отправить личное сообщение для vasa_c Посмотреть профиль Найти все сообщения от vasa_c
 
Регистрация: 12.03.2008
Сообщений: 183

Сообщение от nondeterminism Посмотреть сообщение
vasa_c,
Миксины -- это вообще говно, засирающее память и ломающее архитектуру, я обсуждать эту тему даже не хочу, в силу ее самоочевидности, как бы.
А, пардон, не признал...
Ответить с цитированием
  #10 (permalink)  
Старый 30.04.2015, 08:06
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
множественное наследование в JS kotlov-net Общие вопросы Javascript 12 22.02.2015 22:45
наследование в js torsar Общие вопросы Javascript 2 25.10.2014 22:33
Не получается вставить код js в HTML garmoni Элементы интерфейса 3 05.09.2013 05:56
Множественное наследование - миф или реальность?! B~Vladi Оффтопик 109 04.09.2012 16:13