Przesylanie informacji z klasy do klasy nie uzywajac dziedziczenia

0

Czesc zastanawiam sie jak polaczyc dwie klasy (nie uzywajac extends), tak aby przeslac z klasy A do klasy B jakies informacje. Zrobilem takie cos ale to nie dziala, wiadomo, this.map nie dziala bo w tej klasy po prostu czegos takiego nie ma. A chcialem zeby to tak fajnie bylo zrobione obioktowo, no ale jednak tutaj w tym przypadku bez uzycia extends. Moze jakis callback? Czy jest to niemozliwe? Zrobilem takie cos

 
class MiddleWare {
  construct(){
    this.map = 'MAP';
  }
  calculate(){
    return this.map;
  }
}


class A {
  constructor(middleware){
    console.log(middleware.calculate());
  }

}

var a = new MiddleWare;
var Taczka = new A(a);

0

hint: w es6 jest funkcja constructor(), a nie construct :)

To co chcesz uzyc to tzw. kompozycja (ang. composition) i jest to jeden z wzorcow projektowych. Czesto jest to duze lepsze rozwiazanie od dziedziczenia.

var MyLibrary = {
  can: function (obj, methodName) {
	if(Array.isArray(methodName)) {
  	return methodName.every(function(fn) {
    	return typeof obj[fn] === "function"
    });
  }
  
   return typeof obj[methodName] === "function";
 }
};


class Duck {
  constructor(flyingBehaviour) {
    if(MyLibrary.can(flyingBehaviour, ["fly", "nitro"])) {
      this.flyingBehaviour = flyingBehaviour;
    } else {
    	throw new Error("flyingBehaviour must implement fly and nitro methods");
    }
  }
  
  fly() {
    this.flyingBehaviour.fly();
  }
  
  nitro() {
    this.flyingBehaviour.nitro();
  }
}

class FlyingBehaviour {
  constructor(flyingSound) {
    this.flyingSound = flyingSound;
  }
  
  fly() {
    console.log(this.flyingSound);
  }
  
  nitro() {
    this.flyingSound = "!!!!!!! " + this.flyingSound + " !!!!!!!"; 
  }
}

class FlyingWithWings extends FlyingBehaviour{
  constructor(flyingSound) {
    super(flyingSound, flyingSound);
  }
  
  fly() {
    super.fly();
  	console.log("Flying rocket!");
  }
}

class CantFly extends FlyingBehaviour {
  constructor(flyingSound) {
    super(flyingSound, flyingSound);
  }
  fly() {
    super.fly();
    console.log("I can't really fly :(");
  }
}

var uberDuck = new Duck(new FlyingWithWings("Wiiiiiiiiii"));

uberDuck.fly(); 
// Wiiiiiiiii Flying rocket!
uberDuck.nitro();
uberDuck.fly(); 
// !!!!!!!!!! Wiiiiii !!!!!!!!!! Flying rocket!

var penguin = new Duck(new CantFly("...")); // WTF :D

penguin.fly();
// ... I can't really fly :(
penguin.nitro();
penguin.fly(); 
// !!!!!!! .... !!!!!!!! I can't really fly :(
0

Tak, tak, pomylka :D zawsze jak pisze w es6 to ciagle mi bledy wyskakuje przez to moje construct() :P
Koniecznie bede musial sie zapoznac z tym wzorcem, na pewno da mi duzo sprawnosci do kodu, lecz jednak przebrnalem przez to 'gore'. Generalnie zrobilem mniej wiecej taka sekwencje.

 
 export default class API{
 init(){
  var api = new //cos tam (jakies api np. Google);
 }
 this.migrate = function(tocall) {
  tocall(api);
 }
calculate(){
  this.migrate(function(data){
      //teraz mozemy robic operacje na data
  });
 }
} 

Jak juz wspomnialem chcialem takie cos zrobic zeby w Reacie tego uzywac, bo nie chcialem calego jsa pchac do komponentow a jedynie je odtwarzac w tych komponentach. Wiadomo, ze to co sie da to zrobic, ale niektore akcje lepiej w jsie a pozniej po komponentach je rozmieszczac czy cokolwiek chcemy.

 
 import APIfrom '../library/firstAPI'; // i zaciagamy to do naszego komponentu

Zrobilem juz tak wiec nie bede tego zmienial ale w przyszlosci zamierzam zastosowac ten wzorzec.

0

Dzieki wielkie, teraz ferie to bede mial troche wiecej czasu na takie lekturki. :) mam takie pytanie, pracujesz moze na codzien jako front-end developer, lub cos pokrewnego? Bo mam kilka pytan, a mianowicie zastanawiam sie jak czesto (i czy w ogole) uzywa sie juz es6 i czy kazda aplikacje/strone sie pisze w oparciu o oop?

0

OOP to dosyć szeroki koncept i nie powiem, że wszędzie bo moge nie mieć racji, ale bardzo, bardzo często. Przynajmniej w rzeczach z którymi mam styczność. ES6 to zależy od polityki fimry. U siebie używamy bardzo starych technologi (niestety..), więc nie ma o tym mowy. A i projekt jest stary, więc wprowadzenie ES6 zrobiło by jeszcze większy bałagan.

Nie jestem aż tak na bieżąco ale wiem, ze teraz Angular 2 korzysta z ES6 i pewnie wszystko idzie w tym kierunku, więc warto :) Myślę, że @LukeJL może Ci szerzej odpowiedzieć na to pytanie.

0

Angular2 TypeScript React ES6 :D bo wlasnie teraz sobie w nim pisze aplikacje i powiem szczerze ze miazga, wszystkie te ugododnienia, typu bardziej intuicyjny this, importy exporty i masa fajnych spraw jest po prostu spoko, a do tego React. Tworze sobie taki maly projekcik A juz kod jest czytelny, fajniejszy, lepiej zorganizowany i do takiego kodu mozna siadac, a taki kod stricte jQuery bez jakiegokolwiek schematu to masakra. Ale faktcznie chyba czasem nie ma czasu myslec, zeby to zorganizowac dobrze a po prostu walnac kilka efektow i onclickow i koniec zabawy.

To chyba zaloze konto i odezwe sie do pana ;P

1 użytkowników online, w tym zalogowanych: 0, gości: 1