Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz
Mensen die je code lezen zullen dan niet snel doorhebben dat het geen standaard methoden zijn, en er op stuk lopen op het moment dat ze je code willen gaan hergebruiken, maar de prototypes over het hoofd zien
Dat is echter ook het enige argument tegen dat ik op dit moment kan bedenken, want waarom zou het niet netjes zijn?
Ok, een functie-call is vaak net even sneller, maar dat is maar marginaal; ik denk dat het gebruik van custom methods zelfs juist netter is omdat je dan meer consequent aan het programeren bent.
Intentionally left blank
Waarom zouden standaarden dit niet toestaan? Ik zie het probleem niet zo. Of je een functionaliteit nu toevoegt aan het Array object of je maakt er een losse functie van maakt dan voor mij niet meer zoveel uit.drm schreef op 09 maart 2004 @ 22:06:
Aan de andere kant denk ik: We roepen hier altijd heel veel over standaarden, toepassing van zaken zoals ze voorgeschreven zijn. Functionaliteit toevoegen buiten de standaarden om: moeten we dat eigenlijk wel doen?
Het wordt misschien gevaarlijk wanneer je bestaande methods gaat overschrijven lijkt me.
(er van uitgaande dat iedereen zo lui is wat betreft documentatie als ik)
dit?
1
2
| var a = [1, 2, 3]; var b = a.max(); |
of dit?
1
2
| var a = [1, 2, 3]; var b = max(a); |
to-mee-to, to-maa-to
Today's subliminal thought is:
Performance is in dit soort discussies nooit een issue, wat mij betreftcrisp:
Dat is echter ook het enige argument tegen dat ik op dit moment kan bedenken, want waarom zou het niet netjes zijn? Ok, een functie-call is vaak net even sneller, maar dat is maar marginaal;
De nette manier zou imo zijn om een afgeleide eigen implementatie van bijvoorbeeld een array te maken waarin je de standaard functionaliteit van de Array inherit en je je eigen functionaliteit toevoegt. De OO benadering, zeg maar.ik denk dat het gebruik van custom methods zelfs juist netter is omdat je dan meer consequent aan het programeren bent.
Het probleem wat je dan tegen het lijf loopt is dat je jezelf heel erg beperkt als het om codesuiker gaat, zoals het instantieren van een array mbv. de [ .... ] notatie, e.d.
Wat ik er, gevoelsmatig, op tegen heb is dat je eigenlijk tornt aan de "standaard". Het voelt aan als in bijvoorbeeld Java of C++ in de standard library gaan sleutelen omdat je vindt dat een bepaalde methode of class niet precies doet wat je wilt.
Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz
Je voegt een niet bestaande functionaliteit toe, en plaatst deze op een logische plaats. Omdat deze speciaal voor array's bedoeld is. Niets mis mee volgens mij.Wat ik er, gevoelsmatig, op tegen heb is dat je eigenlijk tornt aan de "standaard". Het voelt aan als in bijvoorbeeld Java of C++ in de standard library gaan sleutelen omdat je vindt dat een bepaalde methode of class niet precies doet wat je wilt.
Met lemmings is dat wel een issuedrm schreef op 09 maart 2004 @ 22:31:
[...]
Performance is in dit soort discussies nooit een issue, wat mij betreftDa's een implementatieprobleem.
tsja, JS is nu eenmaal niet OO-based maar prototype-based, live with it[...]
De nette manier zou imo zijn om een afgeleide eigen implementatie van bijvoorbeeld een array te maken waarin je de standaard functionaliteit van de Array inherit en je je eigen functionaliteit toevoegt. De OO benadering, zeg maar.
Het probleem wat je dan tegen het lijf loopt is dat je jezelf heel erg beperkt als het om codesuiker gaat, zoals het instantieren van een array mbv. de [ .... ] notatie, e.d.
Het is niet dat een bepaalde method niet precies doet wat je wilt, maar meer dat een bepaalde method er gewoon simpelweg standaard niet is in JS; ik ken maar weinig methods in JS die niet doen wat ik wilWat ik er, gevoelsmatig, op tegen heb is dat je eigenlijk tornt aan de "standaard". Het voelt aan als in bijvoorbeeld Java of C++ in de standard library gaan sleutelen omdat je vindt dat een bepaalde methode of class niet precies doet wat je wilt.
Intentionally left blank
Nope. Dat is misschien het geval in traditionele 'class-based' talen zoals C++ of Java, maar het geval is dat Javascript veel meer weg heeft van de 'andere kant', talen zoals Smalltalk en Eifel Methodes toevoegen via het prototype object, is juist daarvoor bedoeld, zoals de specificaties melden:drm schreef op 09 maart 2004 @ 22:31:
De nette manier zou imo zijn om een afgeleide eigen implementatie van bijvoorbeeld een array te maken waarin je de standaard functionaliteit van de Array inherit en je je eigen functionaliteit toevoegt. De OO benadering, zeg maar
ECMAscript en daaruit afgeleide talen zoals Javascript en Actionscript 1.0 zijn heerlijke dynamische talen om in te ontwikkelen, soms zelfs mooier in oplossing dan een 'traditionele taal'. Voor een diepgaande vergelijking tussen prototype-gebaseerde talen en class-gebaseerde talen, bekijk eens de volgende link van MIT AI Lab:In a class-based object-oriented language, in general, state is carried by instances, methods are carried by classes, and inheritance is only of structure and behaviour. In ECMAScript, the state and methods are carried by objects, and structure, behaviour, and state are all inherited.
[..]
A prototype is an object used to implement structure, state, and behaviour inheritance in ECMAScript. When a constructor creates an object, that object implicitly references the constructor’s associated prototype for the purpose of resolving property references. The constructor’s associated prototype can be referenced by the program expression constructor.prototype, and properties added to an object’s prototype are shared, through inheritance, by all objects sharing the prototype.
Using Prototypical Objects to Implement Shared Behavior in Object Oriented Systems
* oh,when? heeft overigens een aversie tegen de term 'prototyping'...wtf is dat...is een nietszeggende term, en daarnaast niet eens goed. Je zegt toch ook niet 'ik ga eens OO-en in Java? Ik geloof dat Pelle en willem169 hier ooit eens mee zijn begonnen...ga u schamen!
[ Voor 3% gewijzigd door oh,when? op 09-03-2004 22:56 ]
"You're only as good, as what you did last week."
Hm interestingoh,when?:
ECMAscript en daaruit afgeleide talen zoals Javascript en Actionscript 1.0 zijn heerlijke dynamische talen om in te ontwikkelen, soms zelfs mooier in oplossing dan een 'traditionele taal'. Voor een diepgaande vergelijking tussen prototype-gebaseerde talen en class-gebaseerde talen, bekijk eens de volgende link van MIT AI Lab:
Using Prototypical Objects to Implement Shared Behavior in Object Oriented Systems
* oh,when? heeft overigens een aversie tegen de term 'prototyping'...wtf is dat...is een nietszeggende term, en daarnaast niet eens goed. Je zegt toch ook niet 'ik ga eens OO-en in Java? Ik geloof dat Pelle en willem169 hier ooit eens mee zijn begonnen...ga u schamen!
Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz
Duidelijk dat eersteAnnie schreef op 09 maart 2004 @ 22:29:
[...]
dit?
code:
1 2 var a = [1, 2, 3]; var b = a.max();
of dit?
code:
1 2 var a = [1, 2, 3]; var b = max(a);
to-mee-to, to-maa-to
kwam net toevallig nog deze link tegen:
http://www.sitepoint.com/print/1194
Al druist het mij dan weer tegen het gevoel in om te gaan inheriten van instances
Daar sluit ik me helemaal bij aanECMAscript en daaruit afgeleide talen zoals Javascript en Actionscript 1.0 zijn heerlijke dynamische talen om in te ontwikkelen, soms zelfs mooier in oplossing dan een 'traditionele taal'.
Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin
Verwijderd
Waar ik toch altijd veel gebruik van heb gemaakt is bijv:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| Array.prototype.find = function(needle) {
for(var i in this){
if (this[i] == needle){
return i;
}
}
return false;
}
Array.prototype.push = function(el) {
this[this.length] = el;
}
Array.prototype.remove = function(index) {
for (i=index;index<this.length-1;index++){
this[index] = this[(parseInt(index)+1)];
}
this.length=this.length-1;
} |
Ik gebruik vooral de find en remove methods graag. De push is simpelweg meer een additionele fix voor IE5.
Verwijderd
http://w3future.com/weblo...ContextInProgrammingpart2
Ik denk ook dat je met prototyping de boel wat duidelijker kan maken qua code, het scheelt weer een extra argument in je functie, dus ik zie eigenlijk geen nadelen.
Ik vind bijvoorbeeld de indexOf functie voor het array object ontzettend makkelijk. Naar mijn inzien mist die functie dus plak ik hem er zelf even aan (al genoemd door gordijnrail zie ik
Verwijderd
Precies. JS is wat dat betreft een heerlijke quick&dirty taal. Het mist daardoor de structuur om echt lekker diep te gaan, maar als dit soort dingen werken smelt mijn hartAndré schreef op 09 maart 2004 @ 23:37:
Ik vind bijvoorbeeld de indexOf functie voor het array object ontzettend makkelijk. Naar mijn inzien mist die functie dus plak ik hem er zelf even aan (al genoemd door gordijnrail zie ik).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| var _bAlert = true; // Laten we alert eens overschrijven! alert = function() { if(_bAlert) { var sAlert = ''; for(var i=0; i<arguments.length; i++) { sAlert += typeof arguments[i] + '\t'; sAlert += arguments[i] + '\n'; } _bAlert = confirm(sAlert); } } alert(1,'jaja',true); |
Hiermee kun je van die oneindige alert-loopjes voorkomen, want zodra je een keer op cancel hebt gedrukt komen ze niet meer tevoorschijn. Hardstikke handig tijdens ontwikkelen.
zelfde kan je ook doen met window.open (en eigenlijk alles);
1
2
3
4
5
| _winOpen = window.open; window.open = function(url,name,settings) { // confirms en tellers oid _winOpen(url, name, settings); } |
Dat weet ik nog zo net niet. Je kan b.v. eigen methodes bakken om objecten van objecten te laten inheriten, en interfaces implementen is ook goed te doen, b.v met dit.Het mist daardoor de structuur om echt lekker diep te gaan
1
2
3
4
5
6
7
8
9
| Function.prototype.extendsFrom = function(Super) { var Self = this; var Func = function() { Super.apply(this, arguments); Self.apply(this, arguments); } Func.prototype = new Super(); return Func; } |
kan je dan dit doen:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| function User(name) { this.name = name; } User.prototype = { login:function() { alert('login: ' + this.name) }, logout:function() { alert(':w'); } } function Admin(name, level) { this.level = level; } Admin = Admin.extendsFrom(User); |
en * plop *
"interfaces impelementen" kan net zo makkelijk, bv:
1
2
3
4
5
6
7
8
9
10
11
| Function.prototype.implement = function(Face) { for(var i in Face) { this.prototype[i] = Face[i]; } } var SysteemBeheerder = { taunt:function() { alert('users zijn prutsers!'); } } |
met:
1
2
3
4
5
6
7
8
9
10
| function Admin(name, level) { this.level = level; } Admin = Admin.extendsFrom(User); Admin.implement(SysteemBeheerder); var piet = new Admin('piet', 5); piet.login(); piet.taunt(); piet.logout(); |
Dat gaat al best diep
Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin
Het was niet mijn bedoeling dit topic dood te slaan met een bak code eigenlijk
Blijkbaar kan je trouwens ook dingen aan het window prototypen. window zelf heeft geen prototype, maar de .constructor wel
1
2
3
4
5
6
7
8
| Window = window.constructor;
// alert(Window.prototype == window) // false!
Window.prototype.melp = function() {
alert('woei');
}
window.melp(); |
Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin
* AnnieClay schreef op 10 maart 2004 @ 22:04:
code:
1 2 3 4 5 6 7 8Window = window.constructor; // alert(Window.prototype == window) // false! Window.prototype.melp = function() { alert('woei'); } window.melp();
Wat is dan het verschil met
1
2
3
| function melp() { alert('nog meer woei'); }
window.melp(); |
[ Voor 6% gewijzigd door Annie op 10-03-2004 22:16 ]
Today's subliminal thought is:
Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin
"You're only as good, as what you did last week."
* Pelle weet van niksoh,when? schreef op 09 maart 2004 @ 22:55:
Ik geloof dat Pelle en willem169 hier ooit eens mee zijn begonnen...ga u schamen!
Hier op GoT heb ik voor het eerst kennis gemaakt met dit concept, dus als ik ooit ergens die term genoemd heb dan is dat omdat iemand anders me het verkeerde voorbeeld heeft gegeven