ugrás a tartalomhoz

Buffer.prototype = new Array();

Karvaly84 · 2011. Júl. 2. (Szo), 08.45
Helló guruk!

Az Array osztályt szeretném kiterjeszteni, egy buffer-t szeretnék html elemeknek, amit css selector-okkal tudok feltölteni és arra gondoltam az alap Array tökéletes alap lenne, de pl a splice metódusnál a length tulajdonság változik csak rendesen az elemek, indexek ott maradnak ha nem szurok be új elemet (mondjuk ezt ki lehet küszöbölni), de azért érdekelne, hogy, valaki próbált már ilyesmit? Csak szeretném elkerülni a napig tartó tesztelést minden böngészőn azért kérdezem, hogy lehet e így csinálni működnek e a örökölt metódusok?
 
1

Miért kell ezt ennyire

Hidvégi Gábor · 2011. Júl. 2. (Szo), 09.03
Miért kell ezt ennyire elbonyolítani? Nem egyszerűbb a dolgokat egy sima tömbbe belepakolni, és pár függvénnyel birizgálni? Így tutira működne minden böngészőn.
2

Én nem gondoltam hogy ez túl

Karvaly84 · 2011. Júl. 2. (Szo), 21.13
Én nem gondoltam hogy ez túl bonyolítás, számomra tök egyszerűnek tűnt, mint mikor java-ban terjesztek ki egy osztályt, bár tudom hogy a javascript nem java és nincsenek "osztályok" de elvileg van öröklődés és gondoltam ki használnám itt is ezt a dolgot. Ilyesmi megoldást láttam már más javascript könyvtárakban, anno én is csináltam egy buffert amiböl csináltam minden mást, pl observer-eket meg ilyesmi. csak ott mindent leprogramoztam a push-tol kezdve a indexOf-ig és azért szeretnám az Array-t használni alapnak mert az gyorsabb, de lehet az lesz a vége amit mondtál.
3

Nem kizárt, hogy lehetséges,

inf · 2011. Júl. 2. (Szo), 21.52
Nem kizárt, hogy lehetséges, de még soha nem láttam ilyet...
5

DOMAssistant

Karvaly84 · 2011. Júl. 2. (Szo), 23.11
DOMAssistant például. a 3. illetve a 103. sortól, bár itt a splice nincs optimalizálva. Hasonlót szeretnék de nem csak HTML elemekre hanem minden másra is.
10

Ilyesmi

Poetro · 2011. Júl. 3. (V), 14.46
Én valami ilyesmivel indulnék:
function Buffer() {
  this._data = [];
}
Buffer.prototype = {};
(function (){
  var i = arguments.length
    , ap = Array.prototype
    , p = Buffer.prototype
    , name;
  function apply(name) {
    var fun = ap[name];
    return function () {
      return fun.apply(this._data, arguments);
    }
  }
  while (i--) {
    name = arguments[i];
    p[name] = apply(name);
  }
  // A lista bővíthető
}('slice', 'splice', 'push', 'pop', 'shift', 'unshift'));
11

Ezzel kapcsolatban egy

Karvaly84 · 2011. Júl. 3. (V), 22.47
Ezzel kapcsolatban egy kérdésem lenne, ha a this._data egy tömb akkor a tömbre mért a tömb prototípusának függvényét hívod meg? elvileg ugyan az történik mint ha naturban a this._data metódusát hívnánk. vagy nem? amúgy én is hasonló vonalon gondolkodok, csak pl majd úgy kell megoldanom. hogy a buffer.slice egy új buffert adjon vissza ne tömböt. meg ilyesmi.
12

prototype

Poetro · 2011. Júl. 4. (H), 10.42
Azért használom, az Array.prototype metódusait, mert ha véletlenül megváltozna a this._data típusa, vagy annak metódusai, akkor is az elvárt módon működjenek a tömb függvények rajta (kivéve ha pont a módosított működés lenne az elvárt). Ezen kívül, mivel az Array.prototype metódusai statikusabbnak tűnnek, jobb megközelítésnek tűnik azok használata, mint a dinamikusan létrejött tulajdonságéi. Természetesen nem kell követni az én elgondolásomat, de én így látom helyesebbnek a megközelítést (és valószínűleg teljesítményben a két megközelítés azonos sebességet fog mutatni).
4

Problémák

Poetro · 2011. Júl. 2. (Szo), 23.10
Ezzel csak az a probléma, hogy nem működik konzisztensen, és ismételten ki lehet találni, mely böngészőben nem működik úgy, ahogy kellene... hát persze hogy IE6-7.
Írtam egy egyszerű kis kódot:

function Buffer() {
}
Buffer.prototype = [];

var buffer = new Buffer();
buffer.push('A');
document.getElementsByTagName('body')[0].appendChild(
  document.createTextNode("Length: " + buffer.length)
);
Ekkor ugye minden böngészőnek azt kellett volna kiírni a body-ba, hogy Length: 1. Természetesen IE6-7 esetében a kiírás Length: 0 értéket mutat. Innentől kezdve érdemes elgondolkodni azon, hogy érdemes-e natív objektumokat kiterjeszteni, ha használni is akarjuk azoknak pár "mágikus" tulajdonságát. Arra már nem is merek gondolni, mi történne akkor, ha mondjuk nem buffer.push-t használtam volna, hanem buffer[100] = 'A'. Elárulom, egyik se módosítja a .length értékét.

A címmel kapcsolatban pedig elárulom, hogy a new Array()-re semmi szükség, a [] rövidebb, és ugyanazt csinálja.
6

Tényleg csak a 8-astol megy

Karvaly84 · 2011. Júl. 2. (Szo), 23.45
Tényleg csak a 8-astol megy :(
Úgy látom bele kel törődnöm, hogy a DOM osztályok után ez sem fog menni. Marad az Array újra írása Buffer néven, nem tudom mért kezdtem el javascript-et tanulni...

a new Array()-re semmi szükség, a [] rövidebb, és ugyanazt csinálja

ezt tudom csak szépen akartam leírni :D
7

Ez nem a javascript, hanem az

inf · 2011. Júl. 3. (V), 00.00
Ez nem a javascript, hanem az msie hibája...
Egyébként mindent olyan szépen meg lehetne csinálni js-ben, ha nem létezne az a böngésző... Én is nyugodtabban aludnék... :D
8

Chrome-ban és Opera-ban

Karvaly84 · 2011. Júl. 3. (V), 00.51
Chrome-ban és Opera-ban tökéletesen működnek az ilyen fajta megvalósítások, mondjuk ezt a Array témát még nem teszteltem ezeken de régebben mikor a Node-ot babráltam akkor minden szépen ment, Chrome-ban csak a Buffer örökölt splice metódusát teszteltem és nem hagyott szemetet mikor töröltem, ellenben a FF-el ami érdekeseket produkált. Mélyen nem ástam magam bele, de Opera-ban, Chrome-ban szerintem úgy lehet programozni mint mindenhol máshol, ki lehet terjeszteni bármilyen osztályt. De mondom mélyebben nem mentem bele csak pár dolgot próbáltam ki és csak ezeken működött.
9

Én msie miatt már nem

inf · 2011. Júl. 3. (V), 10.07
Én msie miatt már nem próbálkozom ilyen extrákkal... Elment a kedvem a kliens oldali js-től...