[JS] Prototypen van bestaande objecten?

Pagina: 1
Acties:

  • user109731
  • Registratie: Maart 2004
  • Niet online
Hoi :)

Ik heb 2 vragen over het prototype-mechanisme van JS, waar ik graag de mening van anderen over zou horen. Een vaak gehoorde opvatting is dat het prototypen van Object in JavaScript iets vreselijks is, en ik vraag me af waarom. Ik snap wel dat het vaak handiger is om een object lager in de hierarchie te pakken als het even kan: Array.prototype.indexOf heeft de voorkeur boven Object.prototype... . Maar er zijn vast situtaties waarin je een bepaalde methode op alle objecten zou willen gebruiken. Ik heb ooit een voorbeeld gezien (van crisp?) van een script waarin object.prototype werd gebruikt om een object te serializen... Dat lijkt mij best wel handig. Zomaar een voorbeeldje, het gaat mij er niet zozeer om of het handig is en wanneer, maar meer om het principe :) Ik snap wel dat het not-done is om Object met van alles en nog wat te gaan prototypen, maar dan sla je imho door naar de andere kant :)

Hét tegenargument is het object-als-hashmap principe van JS. Vaak word er dan een for(var x in y) laten zien, en 'kijk: het loopen werkt niet meer goed!' :) Maar dat kan toch gewoon met hasOwnProperty() opgelost worden? Prototype is toch net zo goed een JS-feature? Imho is het zo dat hasOwnProperty() dé oplossing is als deze 2 JS-features (prototype/hashmap) botsen. :)

Ik heb de search en Google gebruikt, maar kom niet echt veel nuttigs tegen. Wel websites van mensen als Dean Edwards die zeggen dat het streng verboden is, en bijvoorbeeld deze website. Het voorbeeld wat hij geeft is btw ook prima met hasOwnProperty() op te lossen :)

Tweede vraag: hoe gaan jullie om met het prototypen van andere objecten, zoals html elementen? Ik zie het eigenlijk bijna nooit, terwijl er imho wel wat in zit. Voorbeeld: je hebt een tabel, die je wilt kunnen sorteren. Waarom dan niet een HTMLTableElement.prototype.sort = ... ? Dat maakt je code volgens mij veel cleaner: table.sort() ipv sortTable(table). Ik kom wel topics tegen als deze: [purisme] prototypes / OO in JavaScript *, maar daar zie ik ook niet echt nadelen van betekenis...

Kortom: waarom word prototypen niet veel meer gebruikt? Is er echt wat mis mee, of is het enkel onbekendheid, of is er nog wat anders? Ik zou het zelf wel vaker willen gebruiken, maar ik wil eerst goed weten wat de nadelen zijn :)

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:16

crisp

Devver

Pixelated

Object.prototype is als een moker (alles overerft van Object), even afgezien van het object-als-hashmap argument en vele programmeurs die geen rekening houden met prototyped methods bij hun for-in constructs (dat zijn veelal dezelfde mensen die zeggen dat Object.prototype 'verboten' is) zijn er maar heel weinig gevallen waarbij Object.prototype ook echt nuttig is en de voordelen opwegen tegenover de nadelen. Uiteindelijk heb ik mijn serializer ook herschreven naar een gewone functie met een switch op constructor.

Verder wordt hasOwnProperty door oudere browsers niet ondersteund maar gelukkig is dat op te lossen... door Object te prototypen :P
JavaScript:
1
2
3
4
5
6
7
if (!Object.prototype.hasOwnProperty)
{
    Object.prototype.hasOwnProperty = function(p)
    {
        return this.constructor.prototype[p] === undefined;
    }
}


Dat prototypen van HTMLElement e.d. objecten niet veel wordt gebruikt heeft 1 belangrijke reden: IE

[ Voor 9% gewijzigd door crisp op 03-11-2006 16:18 ]

Intentionally left blank


  • user109731
  • Registratie: Maart 2004
  • Niet online
bedankt, dus als ik het goed begrijp word object.prototype vooral niet gebruikt omdat er vrijwel altijd betere alternatieven zijn... Maar in jouw code isie wel weer praktisch: het toevoegen van methoden aan alle objecten als ze niet geimplementeerd zijn :)
crisp schreef op vrijdag 03 november 2006 @ 16:14:
Dat prototypen van HTMLElement e.d. objecten niet veel wordt gebruikt heeft 1 belangrijke reden: IE
Dom, ik had een simpele pagina gebouwd en getest in Firefox, maar ik ging er vanuit dat het in IE ook wel zou werken omdat die wel prototypen ondersteund, en ik dacht dat ik ooit een prototyped NodeList succesvol werkend had in meer browsers, maar dat was zeker in Firefox en Opera dan... :)

Opzich wel interessant, zijn dingen als nodelists en htmlElementen in IE gewoon een vreemd soort object (ongelukkig woord nu) en geen écht/native object die van Object afstamt? :)
Een alert geeft [object]...

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:16

crisp

Devver

Pixelated

Net zo native als XMLHttpRequest in IE7; het zijn COM-objecten en derhalve geen native javascript-objecten...

Intentionally left blank