Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[js] getters en setters in IE

Pagina: 1
Acties:

Verwijderd

Topicstarter
getters en setters in IE werken niet. Nu kreeg ik een idee om getters er toch in te krijgen, namelijk via de toString method van elk object:

JavaScript:
1
2
3
4
5
6
7
if (!Object.__defineGetter__) Object.prototype.__defineGetter__ = function(prop,func) {
    this[prop] = new Object();
    var self = this;
    this[prop].toString = function() {
        return func.apply(self);
    }
}


propleem is dat als je de property overschrijft dat de boel niet meer werkt, maar dit is iig een leuke start

wat setters betreft: ik had nog geen goed idee, maar wellicht kunnen we iets met de constructor? Als je namelijk doet:
code:
1
obj.prop = 'aStr';

wordt onder water het volgende gedaan:
code:
1
obj.prop = new String('aStr');

dit geldt voor elk type, omdat alle typen in js gewoon objecten zijn.
Als op het moment van setten de constructor van dat type net even anders is, dan kan je een setter method uitvoeren lijkt me

any thoughts?

testcase:
JavaScript:
1
2
3
4
5
6
var d = new Date();
d.year = 2008;
d.__defineGetter__('year',function(){alert(this.getFullYear())});
alert(d.year);
d.year = 2008;
alert(d.year);

Fx alert '2007', 'undefined', '2007', 'undefined'
IE alert '2007', 'undefined', '2008'
(tweede keer wordt de hele bende overschreven en werkt het niet meer)

[ Voor 18% gewijzigd door Verwijderd op 26-08-2007 09:34 ]


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Verwijderd schreef op zondag 26 augustus 2007 @ 09:08:
wat setters betreft: ik had nog geen goed idee, maar wellicht kunnen we iets met de constructor? Als je namelijk doet:
code:
1
obj.prop = 'aStr';

wordt onder water het volgende gedaan:
code:
1
obj.prop = new String('aStr');

dit geldt voor elk type, omdat alle typen in js gewoon objecten zijn.
Als op het moment van setten de constructor van dat type net even anders is, dan kan je een setter method uitvoeren lijkt me
Je wilt dus de constructor class overloaden? Dan heb je een probleem met literals, wat je hier stelt is per definitie namelijk niet zo :P
JavaScript:
1
2
3
4
5
var s = 'woei';
alert(typeof s); // string

var s = new String('woei');
alert(typeof s); // object

Als we nu een nieuwe String class aanmaken:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
function String(value)
{
    this.value = 'waa?';
    this.toString = function()
    {
        return this.value;
    }
}

var s = new String('woei');
alert(s); // waa?

ok, dat werkt. Maar nu met een literal:
JavaScript:
1
2
var s = 'hoi!';
alert(s); // hoi

ej, dat werkt niet :/

Verder denk ik dat je zonder setters het probleem met het overschrijven van je getter niet kan afvangen. Sowieso heb je in IE dan nog het probleem dat dergelijke constructies voor DOM elementen onmogelijk zijn.

Intentionally left blank


Verwijderd

Topicstarter
mja, ik had ook verder echt geen idee of en hoe het zou kunnen.

Wat wel is:
JavaScript:
1
2
var s = 'hoi!';
alert(s.constructor);

levert je dus String terug

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Verwijderd schreef op zondag 26 augustus 2007 @ 13:27:
mja, ik had ook verder echt geen idee of en hoe het zou kunnen.

Wat wel is:
JavaScript:
1
2
var s = 'hoi!';
alert(s.constructor);

levert je dus String terug
Dat klopt, maar het is geen object instance van die constructor ;)

Intentionally left blank