Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin
Verwijderd
Je weet de kleuren wel te kiezen, toen ik hem had gelezen, en hem wegklikte leek het alsof ik een rode gloed over mijn scherm had
[ mierenneuk mode ]
Tikfoutje:
Mist goed toegepast is er ontzettend veel mogelijk en kunnen er geweldige (en ook stabiele) bijna-applicaties mee worden gebouwd.
verder duidelijk en helder geschreven... alleen ga ik nu een biertje pakken om van die waas voor m'n ogen af te komen
Verwijderd
Zou er ook een afdrukvriendelijke versie kunnen komen? Het liefst iets smaller. Ik heb de pagina's nu afgedrukt en kwam er achter dat er aan het einde van iedere regel wat ontbreekt, leest zo lastig
Dit is wel weer super van je
1
2
3
| function Monster() {
// "Super" object
} |
Ik heb echter wel iets vreemds ondervonden; een dmv prototyping toegevoegde method schijnt door IE ook als property gezien te worden; dat geeft nog wel eens problemen als ik door de properties heen wil lopen. Moz/NS hebben dit 'probleem' niet.
Een voorbeeld:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
| function topic(arg) {
// set default properties
this.topic = '0';
this.title = 'unknown';
this.forumid = 'ZZZ';
this.forum = '0';
this.stime = 0;
this.topicstarter = 'unknown';
this.starterid = '0';
this.time = 0;
this.lastreplier = 'unknown';
this.replierid = '0';
this.numreplies = 0;
this.ltime = 0;
this.curreplies = 0;
// override properties from arguments
for (var el in arg) { this[el] = arg[el]; }
}
// Topic toSource method
function Topic_toSource() {
var returnstring = '{';
for (var el in this) {
if (!Topic.prototype[el]) {
if (returnstring.length > 1) returnstring += ',';
returnstring += el +':';
if (isNaN(this[el])) returnstring += '\'' + this[el] + '\'';
else returnstring += this[el];
}
}
returnstring += '}';
return returnstring;
}
Topic.prototype.toSource = Topic_toSource; |
Je ziet dat ik hier in de functie Topic_toSource een uitvraging 'if (!Topic.prototype[el])' heb zitten; als ik namelijk in IE dmv 'for (var el in new Topic())' door de properties heenloop, dan krijg ik vanzelf een propertie 'toSource' voor mijn kiezen van het type '[object]'. Heel vervelend en ongewenst natuurlijk.
Nogmaals: Moz/NS hebben die vervelende gewoonte niet.
Welke browser zit hier nou fout?
Intentionally left blank
Ik vind het eigenlijk lastig dat standaard objecten geen functies laten zien als je for(var i in object) doetcrisp
Ik heb echter wel iets vreemds ondervonden; een dmv prototyping toegevoegde method schijnt door IE ook als property gezien te worden; dat geeft nog wel eens problemen als ik door de properties heen wil lopen. Moz/NS hebben dit 'probleem' niet.
Een voorbeeld:
code:
1 voorbeeld
Heel vervelend en ongewenst natuurlijk.
Nogmaals: Moz/NS hebben die vervelende gewoonte niet.
Welke browser zit hier nou fout?
Ik ga er trouwens nog 1 stukje bijschrijven, over het kopieren van objecten, hierom:
1
2
3
4
5
| var henk = [1,2,3]; var piet = henk; piet[1] = 4; // henk == [1,4,3] |
Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin
Yep, is inderdaad ook iets om rekening mee te houden op het moment dat je echt een kopie wilt hebben, zonder het origineel te beinvloedenOp zondag 30 juni 2002 11:53 schreef Clay het volgende:
Ik ga er trouwens nog 1 stukje bijschrijven, over het kopieren van objecten, hierom:
code:
1 2 3 4 5 var henk = [1,2,3]; var piet = henk; piet[1] = 4; // henk == [1,4,3]
Intentionally left blank
Daar had ik het laatst nog over met drm.. dat het op zich raar is dat wanneer je een string kopieert, er ook een kopie wordt gemaakt, maar wanneer je een array of een object kopieert, er alleen een reference naar toe gemaakt wordt.Op zondag 30 juni 2002 11:53 schreef Clay het volgende:
Ik ga er trouwens nog 1 stukje bijschrijven, over het kopieren van objecten, hierom:
[code]var henk = [1,2,3];
Er zou eigenlijk een universele operator moeten komen die de value overneemt, en een operator waarmee je een reference aanmaakt. Ben je meteen van het gedonder af dat je eigen copy() functies moet schrijven.
Verwijderd
Hopelijk breidt dit zich uit tot een hele serie over OO-JavaScript. Er valt namelijk nog zoveel over te vertellen!
Op zondag 30 juni 2002 13:37 schreef Blues het volgende:
Een goed begin. Lekker duidelijk, laat niets te wensen over.
Hopelijk breidt dit zich uit tot een hele serie over OO-JavaScript. Er valt namelijk nog zoveel over te vertellen!
Ik heb er nu ook een stukje over kopieren van objecten bijgezet, dus op zich moet het nu een vrij compleet verhaal zijn.
Ik hoop ook dat het inderdaad een duidelijk verhaal geworden is voor mensen die er nog niet veel mee gedaan hebben
Mocht dat wel zo zijn wil ik best meer tuto's gaan maken trouwens.
Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin
Vet goede tut! Voor het eerst dat ik iets van OO begrijp
En kun je misschien een vervolg hierop schrijven? Zoiets is namelijk errug handig
Restecp
Verwijderd
Voorbeeld:
1
| schaapje = setTimeout("alert('blaat');", 5000); |
Dit vind ik een ranzige oplossing, aangezien het in principe een veredelde eval() functie is. Volgens de Netscape implementatie kun je het volgende doen:
1
2
3
4
| schaapje = setTimeout(alert, 5000, 'blaat'); oftewel variabele = setTimeout(fPointer, tijd, args); |
Helaas ondersteunt Internet Explorer dit niet, en zelfs dan is nog niet te bereiken wat ik wil, en wat Clay zo te zien ook heeft geprobeerd.
Ik heb het nog iets anders geprobeerd, maar ook dat bleek niet te werken:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| function TimerObject()
{
this.intervals = new Array();
this.timeouts = new Array();
this.addInterval = function addInterval(obj, interval)
{
this.intervals.push(setInterval(obj.update, interval));
}
}
function CustomObject(name)
{
this.name = name;
this.setInterval = function setInterval(interval)
{
document.timer.addInterval(this, interval);
}
this.update = function update()
{
alert(this.name);
}
}
document.timer = new TimerObject();
schaapje = new CustomObject('blaat');
blaat.setInterval(2000); |
Volgens mij is dit niet zonder ingenieus truuckje op te lossen, of heeft iemand die al op de 100% OO manier voor elkaar gekregen?
Voor de duidelijkheid: het object dat wordt aangesproken bij obj.update is het window object in plaats van het opgegeven object
Voor de rest is het volgens mij een hele nette tutorial, veer respect daarvoor
Verwijderd
iddOp zondag 30 juni 2002 15:56 schreef Cheatah het volgende:
Ik vind het zo verschrikkelijk jammer dat je niet op de object oriented manier objecten kunt meegeven als argument aan een setTimeout of setInterval, zonder als eerste argument een string mee te geven, maar een function pointer.
code:
1 voorbeeld
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| document.objects = [];
Object.prototype.setInterval = function(str, time) {
// obj ergens instoppen
var id = 'obj'+document.objects.length;
document.objects[id] = this;
// interval zetten
return setInterval('document.objects["'+id+'"].'+str, time);
}
function Ding() {
this.teller = 0;
}
Ding.prototype.update = function() {
window.status = this.teller ++;
}
ding = new Ding();
ding.setInterval('update()', 40) |
maar dan zit je wel weer met een extra array, en je bent nog steeds strings aan het evallen.
Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin
Verwijderd
Maar dat kun je natuurlijk veranderen
1
2
3
4
5
6
7
8
9
10
11
12
| Object.prototype.eval = function($code){ eval($code); }
Object.prototype.setTimeout = function($code, $time)
{
var $scheduleNumber = null;
if ( Object.schedules == null )
Object.schedules = [];
$scheduleNumber = Object.schedules.push(this) - 1;
$code = $code.replace(new RegExp('(\'|\\\\)', 'g'), '\\$1');
return window.setTimeout('Object.schedules[' + $scheduleNumber
+ '].eval(\'' + $code + '\')', $time);
}; |
Hier meer info over bovenstaande code (onderen)
Verwijderd
Ik ben nu dik over de helft, en het meeste kwam me wel bekend voor maar ook veel dingen niet..
Top !
Verwijderd
Ik kan me niet zo gauw iets bedenken dat in een eventueel deel twee zou kunnen komen? Zorg eerst maar dat je dit beheerst, en dat betekent lekker veel rommelen, en verder hangt het compleet af van je eigen imagination* om iets te maken. Er is hiermee al zoveel mogelijk, dus ik denk dat dit voorlopig een vrij complete tutorial is.<span style="font-size: 1px;">* kan even niet op het nederlandse woord komen..</span>Op maandag 01 juli 2002 00:59 schreef ThaGroov het volgende:
/me kijkt al uit naar deel 2
Verwijderd
Voor degene die JS al wat beheerst jah, misschien kan er nog wel wat meer aan basiskennis worden gegegeven. Niet iedereen kent immers de grondslagen van JSOp maandag 01 juli 2002 02:06 schreef Cheatah het volgende:
dus ik denk dat dit voorlopig een vrij complete tutorial is
Misschien een idee om een verwijzing op te nemen naar een tut met "Het gebruik en de werking van variabelen en methoden en het verschil tussen globale en lokale variabelen." ?Deze tutorial gaat er vanuit dat je bekend bent met de basis van Javascript. Dat wil zeggen; Het gebruik en de werking van variabelen en methoden en het verschil tussen globale en lokale variabelen. Is dat niet het geval dan heeft het geen zin deze tutorial te lezen, en raad ik je aan dat eerst onder de knie te krijgen.
Oh, en je bent nu ook gelinked vanaf digcult voor extra personality boost
1
2
3
4
5
6
| Object.prototype.clone = function () {
ret = new Object();
for ( i in this )
ret[i] = this[i];
return ret;
} |
't enige nadeel hiervan is, dat je altijd een variabele van het type "object" terugkrijgt. Hoe kun je het type (de class) van een object achterhalen, om er vervolgens een nieuwe instantie van te maken
Overigens is het voordeel van een clone () method, dat alle objecten (die dus deriven van Object) die methode gewoon weer kunnen overriden met een eigen implementatie, en de rest van je code er gewoon vanuit kan gaan dat de clone () method doet, waar hij voor staat
Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz
1
2
| alert(typeof [1,2,3] + ' ' + typeof (new Object()) + '\n'
+ [1,2,3].constructor + ' ' + (new Object()).constructor) |
Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin
Dan is dit dus de oplossing:
1
2
3
4
5
6
| Object.prototype.clone = function () {
ret = this.constructor ();
for ( i in this )
ret[i] = this[i];
return ret;
} |
edit:
Voorbeeldje:
1
2
3
4
5
| a = [1,2,65,7,345]; b = a.clone (); b[2]='sjekko'; alert ( b ); alert ( a ); |
edit2:
Werkt uiteraard weer niet met "primitieve objecten" (zal ik maar zeggen), zoals String, Regex en Number...
Maar die objecten kopieren sowieso al, dus dat gaf niets.
Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz
In dit topic werd deze tut even genoemd, en nou wil het toeval dat die tut onlangs een behoorlijke update/uitbreiding heeft ondergaan. De nieuwe is opgedeeld in 3 onderdelen;
- de basis
- overerving
- scope
met een her en der een paar zijsprongen
De link:
http://www.xs4all.nl/~peterned/tutorial/
evt. is die binnenkort ook in .doc vorm beschikbaar (~ 20 pag.), mede omdat ik hiervoor m'n laatste vrije studiepunten heb gekregen
En dat wil ik graag nog een keer vragen... Nu is mijn vraag of jullie hem willen lezen, en vervolgens kunnen aangeven wat er wel en niet goed aan is, om zo tot een uiteindelijke versie te komen waar iedereen wat aan heeft.
Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| function User(name) {
this.name = name;
}
User.prototype.show = function() {
alert(this.name);
}
function Admin(name) {
}
Admin.prototype.show = function() {
alert("Admin " + this.name);
}
Admin = Admin.extendsFrom(User);
admin = new Admin('henk');
admin.show(); |
Ik heb nu alleen bij Admin een functie show() ook toegevoegd. Als ik nu jouw extendsFrom functie gebruik krijg ik (volgens mij) niet het gewenste resultaat 'Admin henk' maar gewoon 'henk'. Ik heb jouw extendsFrom functie dan voor mezelf ook veranderd naar:
1
2
3
4
5
6
7
8
9
10
11
12
| Function.prototype.extendsFrom = function(Super) {
var Self = this;
var Func = function() {
Super.apply(this, arguments);
Self.apply(this, arguments);
}
Func.prototype = new Super();
for(var p in Self.prototype) {
Func.prototype[p] = Self.prototype[p];
}
return Func;
} |
Commentaar hierop is natuurlijk welkom (vooral als het niet klopt natuurlijk
EDIT: Sorry, ik zie dus dat je de regel:
1
| Admin = Admin.extendsFrom(User); |
gelijk achter de constructor moet prakken, anders overschrijf je je functies van het Admin prototype. Misschien handig om dit in de tutorial te vermelden.
[ Voor 15% gewijzigd door Amras op 20-03-2004 12:33 ]
Je moet inderdaad de extendsFrom direct na de constructor aanroepen, en daarna weer extra dingen aan je nieuwe object prototypen. Anders zou je idd een dergelijke for loop nodig hebben. Da's misschien inderdaad wel ff een punt om te noemen jacode:
1 2 3 4 5 6 7 8 9 10 11 12Function.prototype.extendsFrom = function(Super) { var Self = this; var Func = function() { Super.apply(this, arguments); Self.apply(this, arguments); } Func.prototype = new Super(); for(var p in Self.prototype) { Func.prototype[p] = Self.prototype[p]; } return Func; }
Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin
Verder is er nog een reden om die for-lus er wel bij te zetten, namelijk in het geval van deze notatie (die ik zelf nu gebruik):
1
2
3
4
5
6
7
| function Admin() {
}
Admin.prototype = {
bla: function() {
}
} |
In dit geval zou je dus je prototype overschrijven nadat je de extendsFrom hebt gedaan en ben je de functies van User kwijt. Als je die for-lus erin zet en pas na je prototype definitie gaat extenden gaat het zo ook goed.
Dat zie je nu ook weerLet wel, dit is maar 1 manier om dit te doen. Er zijn er vast ook meer, zoals alles eigenlijk wel op meerdere manieren te doen is.
Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin
1
| var a = [1,2,3,4]; // Array |
Hier houdt a een referentie naar een anoniem array vast, a is dus geen array. Dat mag je iets duidelijker vermelden om verwarring te voorkomen. Als a een array was en b = a; dan heeft b wel een eigen kopie van het array.
Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.