Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: OOP i dziedziczenie
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
mrok
Mam sobie taki oto kodzik:


  1. var xsApp = window.xsApp || {};
  2.  
  3. /**
  4. * @namespace xsApp
  5. * @class util
  6. */
  7. xsApp.util = {};
  8.  
  9. /**
  10. * @namespace xsApp.util
  11. * @class iterator
  12. */
  13. xsApp.util.iterator = {};
  14.  
  15. /**
  16. * Ensure prototypal inheritance
  17. * @namespace xsApp
  18. * @class util
  19. * @method createObject
  20. * @param baseObj Object which properties and method should be inherited
  21. * @return Object
  22. */
  23. xsApp.util.createObject = function (baseObj) {
  24. function F(){}
  25. F.prototype = baseObj;
  26. return new F();
  27. };
  28.  
  29. /**
  30. * @namespace xsApp.util
  31. * @class iterator
  32. * @method getIterator
  33. * @param arr Array used to build iterator
  34. * @return Iterator
  35. */
  36. xsApp.util.iterator.getIterator = function (arr) {
  37. var list = arr,
  38. index = 0,
  39. length = list.length;
  40. if ($.isArray(list)){
  41. return {
  42. first : function () {
  43. return list[0];
  44. },
  45. next : function () {
  46. return list[index++] || null;
  47. },
  48. prev : function () {
  49. return list[--index] || null;
  50. },
  51. current : function () {
  52. return list[index] || null;
  53. },
  54. reset : function () {
  55. return this.seek(0);
  56. },
  57. seek : function (newIndex) {
  58. index = newIndex;
  59. return this;
  60. },
  61. hasNext : function () {
  62. return index < length;
  63. },
  64. hasPrev : function () {
  65. return index > 0;
  66. },
  67. getList : function () {
  68. return list;
  69. },
  70. getCurrentIndex : function () {
  71. return index;
  72. },
  73. getListLength : function () {
  74. return length;
  75. }
  76. };
  77. }
  78. return Error ('xsApp.util.iterator.getIterator - parameter have to be an array');
  79. };
  80.  


potrzebuję też dopisać infiniteIterator, tylko zamiast kopiowac mnustwo kodu chciałbym jakos go wydziedziczyc z poprzedniego iteratora.
Cos jak

  1. /**
  2. * @namespace xsApp.util
  3. * @class iterator
  4. * @method getInfiniteIterator
  5. * @param arr Array used to build iterator
  6. * @return InfiniteIterator
  7. */
  8. xsApp.util.iterator.getInfiniteIterator = function (arr) {
  9. var iter = xsApp.util.iterator.getIterator(arr);
  10. iter = xsApp.util.createObject(iter);
  11.  
  12. iter.hasNext = function () {
  13. return true;
  14. };
  15. iter.hasPrev = function () {
  16. return true;
  17. };
  18. //next i prev oczywiscie podobnie
  19. return inter;
  20. };
  21.  



Ma ktoś pomysł jak to zrobić?
Oczywiście chciałbym uniemożliwość dostęp do zmiennych w iteratorze (cos jak private i byc moze z tym bedzie problem).



wookieb
[JAVASCRIPT] pobierz, plaintext
  1. xsApp.util.iterator.getInfiniteIterator = function (arr) {
  2. var iter = xsApp.util.iterator.getIterator(arr);
  3. iter = xsApp.util.createObject(iter);
  4.  
  5. var length = iter.getListLength();
  6. var parentNext = iter.next;
  7. var parentHasNext = iter.hasNext;
  8. var parentPrev = iter.prev;
  9. var parentHasPrev = iter.hasPrev;
  10. iter.hasNext = function () {
  11. return true;
  12. };
  13. iter.hasPrev = function () {
  14. return true;
  15. };
  16.  
  17. iter.next = function() {
  18. if (!parentHasNext()) {
  19. this.reset();
  20. }
  21. return parentNext();
  22. };
  23.  
  24. iter.prev = function() {
  25. if (!parentHasPrev()) {
  26. this.seek(length - 1);
  27. }
  28. return parentPrev();
  29. };
  30. //next i prev oczywiscie podobnie
  31. return iter;
  32. };
[JAVASCRIPT] pobierz, plaintext


Btw, mam wrażenie, iż twoje next() nie powinno zwracać wartości "następnego" elementu (choć i nawet tego nie robi do końca poprawnie)
zegarek84
Cytat(mrok @ 29.04.2011, 22:51:31 ) *
Ma ktoś pomysł jak to zrobić?
Oczywiście chciałbym uniemożliwość dostęp do zmiennych w iteratorze (cos jak private i byc moze z tym bedzie problem).
Pomysłu nie trzeba mieć a jeśli chcesz to zrobić w miarę optymalnie jak na JS i na to jak jest skonstruowany to przy dziedziczeniu z ograniczeniem do zmiennych może być delikatny problem przynajmniej przy prototypowym dziedziczeniu gdyż jeśli dziedziczysz po jakimś "zwykłym" obiekcie do prototypu posiadającym referencję do zmiennych prywatnych deklarowanych przez var to w kontekście obiektów potomnych będą to zmienne statyczne... co do zmiennych lokalnych to głównie zachować "notację" z deklaracją zmiennnych - przynajmniej edytor będzie pokazywał zmienne prywatne mimo zmiennych publicznych - ale jeśli będziesz chciał to wszystko domknąć to przecież całą aplikację w js możesz zamknąć w anonimowej funkcji ;]

w między czasie temat dałem sobie ofline coby go przeczytać a i jak odpisuję nie jestem świeży jednak uważam, że najlepiej zrobię jak zamieszczę przykładowy kod po części skopiowany od Ciebie z próba przedstawienia dziedziczenia w js gdyż raczej mało osób zna logikę js [fakt nie programuję zawodowo nawet też w node.js ale raczej akurat js mam dopracowane...]

kodzik który w wcześniej naskrobałem bez neta dla ogólnej idei jak nie przepisywać kodów - btw. moje IDE pokazuje, że w JS jest dostępny iterator także na ie od wersji 7 - czyżby wynajdować koło na nowo?? - fakt nie sprawdzałem jakie metody gdzyż to zrobiłem offline...
[JAVASCRIPT] pobierz, plaintext
  1. // ZMIENNE PRYWATNE PRZY DZIEDZICZENIU PROTOTYPOWYM DLA OBIEKTÓW POTOMNYCH
  2. // GDZIE MA DZIAŁAĆ instanceof BĘDĄ SIĘ ZACHOWYWAŁY JAK ZMIENNE
  3. // STATYCZNE - SKOŻYSTAJ Z UMOWNEJ NOTACJI DLA ZMIENNYCH PRYWATNYCH
  4. // Z PODKREŚLENIEM - DODATKOWO JESZCZE MOŻNA "ZAMKNĄĆ" TE OBIEKTY W JAKIEJŚ
  5. // FUNKCJI BY NIE BYŁY WIDOCZNE NA ZEWNĄTRZ
  6.  
  7. // by mieć obiekt bez konstruktora ;] - Twoja funkcja
  8. xsApp.util.createObject = function (baseObj) {
  9. function F(){}
  10. F.prototype = baseObj;
  11. return new F();
  12. };
  13.  
  14. /**
  15.  *
  16.  * @constructor
  17.  */
  18. function Iterator(aArray){
  19. if(aArray instanceof Array){
  20. this._aList = aArray;
  21. } else {
  22. this._aList = Array.prototype.slice.call(aArray);
  23. //throw new Error('Argument nie jest tablicą!!!'); // lub jakiś trace na konsole błędów
  24. }
  25. this._iLength = this._aList.length;
  26. aArray = null;
  27. }
  28.  
  29. Iterator.prototype = {
  30. _aList: null, // array jest przekazywane przez referencję więc trzeba przypisywać w konstruktorze
  31. _iIndex: 0,
  32. _iLength:null,
  33. first : function () {
  34. return this._aList[0] || null;
  35. },
  36. next : function () {
  37. ++this._iIndex;
  38. return this.current();
  39. },
  40. prev : function () {
  41. --this._iIndex;
  42. return this.current();
  43. },
  44. current : function () {
  45. return this._aList[this._iIndex] || null;
  46. },
  47. reset : function () {
  48. return this.seek(0);
  49. },
  50. seek : function (iNewIndex) {
  51. this._iIndex = iNewIndex;
  52. iNewIndex = null;
  53. return this;
  54. },
  55. hasNext : function () {
  56. return this._iIndex<this._iLength;
  57. },
  58. hasPrev : function () {
  59. return this._iIndex>0;
  60. },
  61. getList : function () {
  62. return this._aList;
  63. },
  64. getCurrentIndex : function () {
  65. return this._iIndex;
  66. },
  67. getListLength : function () {
  68. return this._iLength;
  69. }
  70. };
  71. /**
  72.  *
  73.  * @constructor
  74.  * @extends {Iterator}
  75.  */
  76. function InfiniteIterator(aArray){
  77. Iterator.call(this, aArray); // NICZYM parent::__construktor - POCZYTAJ JESZCZE O apply
  78. aArray = null;
  79. }
  80.  
  81. // dziedziczenie bez wykonywania konstruktora z Iteratora - masz do tego metodę swoją ;]
  82. // dzięki takiej konstrukcji możesz nadpisywać metody w obiekcie potomnym nie zmieniając metod u rodzica ;]
  83.  
  84. InfiniteIterator.prototype = xsApp.util.createObject(Iterator.prototype);
  85.  
  86. //nadpisywanie metod - SAMA LOGIKA DZIEDZICZENIA GDYŻ NIE BARDZO WIEM CO CHCESZ OSIĄGNĄĆ ;]
  87.  
  88. InfiniteIterator.prototype.hasNext = function () {
  89. return true;
  90. };
  91.  
  92. InfiniteIterator.prototype.hasPrev = function () {
  93. return true;
  94. };
  95.  
  96. // itd...
  97. // dla obiektów potomnych utworzonych z new InfiniteIterator(array) zadziała także instanceof Iterator
  98.  
  99. // WIADOMO, ŻE KONSTRUKTORY OBIEKTÓW MOŻESZ PODPIĄĆ GDZIEŚ W SWOJEJ PRZESTRZENI NAZW NP. GDZIEŚ W OBIEKTACH STATYCZNYCH {}
  100.  
  101. // TWORZENIE OBIEKTÓW
  102. new Iterator(array);
  103. new InfiniteIterator(array);
[JAVASCRIPT] pobierz, plaintext

sorki za błędy jeśli wystąpiły ale jestem wstawiony...
mrok
Dzieki za pomoc.


Cytat(wookieb)
Btw, mam wrażenie, iż twoje next() nie powinno zwracać wartości "następnego" elementu (choć i nawet tego nie robi do końca poprawnie)

next() nie zwraca nastepnego elementy tylko aktualny i inkrementuje wartość index. Wiem że nie do końca oznacza to "next" i tez sie nad tym glowilem, ale siegnalem do literatury i tam stosują identyczną konstrujcę dla iteratora.

Jesli masz inne zastrzezenia to daj znac.


@zegarek84
Mam wrazenie ze w temacie JS to jesteś poziom wyżej odemnie - jak zrozumiem Twojego posta i pobawie sie Twoim kodem to dam znac wink.gif Dzis niedziela wiec sie obijam
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.