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

[JS] Singleton mét inheritance

Pagina: 1
Acties:
  • 109 views sinds 30-01-2008
  • Reageer

  • Victor
  • Registratie: November 2003
  • Niet online
Ik zit met een vraagstuk waar ik al wel een antwoord op heb, maar waarvan ik niet weet of het de juiste is. Ik heb een base class gedefinieerd en daar zou ik nu een singleton object vanaf willen laten leiden. Ik heb dat als volgt opgelost:
JavaScript:
1
2
3
4
5
6
7
function Base()
{
    this.method = function()
    {
        alert("Base class method was called");
    }
}


Vervolgens gebruik ik de volgende constructie om af te kunnen leiden van deze base class, maar te voorkomen dat er meerdere instanties van dit object komen:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var singleton = function()
{
    function singleton()
    {
        this.anotherMethod = function()
        {
            alert("Singleton method was called");
        }
    }
    
    singleton.prototype = new Base();
    
    return new singleton;
}();


Het werkt allemaal prima, dus dat is het probleem niet. Het voelt echter wel wat 'vies' aan, dus ik vroeg me af of hier nettere/betere oplossingen voor zijn die ik over het hoofd zie.

Graag jullie commentaar/suggesties/kritiek/etc. :)

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 12:57

crisp

Devver

Pixelated

Waarom zou je Base niet zelf als singleton implementeren?

JavaScript:
1
2
3
4
5
6
7
8
9
10
function Base()
{
    if (this == window)
        return new Base();

    if (Base.instance)
        return Base.instance;

    return (Base.instance = this);
}

Intentionally left blank


  • Victor
  • Registratie: November 2003
  • Niet online
crisp schreef op zondag 25 november 2007 @ 21:42:
Waarom zou je Base niet zelf als singleton implementeren?

JavaScript:
1
2
3
4
5
6
7
8
9
10
function Base()
{
    if (this == window)
        return new Base();

    if (Base.instance)
        return Base.instance;

    return (Base.instance = this);
}
Waarom de 'this == window' check?

Verder zou dit in mijn base class betekenen dat ik er enkel singletons vanaf kan leiden en dat is niet de bedoeling.

Wel een elegante oplossing om een singleton te forceren trouwens :)

[ Voor 6% gewijzigd door Victor op 25-11-2007 21:57 ]


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 12:57

crisp

Devver

Pixelated

King_Louie schreef op zondag 25 november 2007 @ 21:55:
[...]

Waarom de 'this == window' check?
Nou, dan hoef ik het 'new' keyword niet te gebruiken :P

Op de Tnet frontpage is bijvoorbeeld de Ajax class op deze manier een singleton; ik doe dan vaak dingen als:
JavaScript:
1
2
3
4
5
var respons = Ajax().sendRequest(url, parms, options);
if (respons)
{
    // whatever
}


:)
Verder zou dit in mijn base class betekenen dat ik er enkel singletons vanaf kan leiden en dat is niet de bedoeling.
Dan maakt een 'singleton wrapper' zoals jij doet wel sense :)

Intentionally left blank


Verwijderd

crisp schreef op zondag 25 november 2007 @ 23:05:
[...]

Nou, dan hoef ik het 'new' keyword niet te gebruiken :P
Dat zie ik je (en anderen) wel vaker doen, maar heb je er nog meer rationale achter dan dat het 3 letters typen scheelt?

Ikzelf vind het gebruik van new altijd wel duidelijk maken dat je een instance aan het maken bent (lees: een nieuw object creeert uit het prototype van een ander object) en niet gewoon een functie aanroept).

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 12:57

crisp

Devver

Pixelated

Verwijderd schreef op maandag 26 november 2007 @ 08:51:
[...]

Dat zie ik je (en anderen) wel vaker doen, maar heb je er nog meer rationale achter dan dat het 3 letters typen scheelt?

Ikzelf vind het gebruik van new altijd wel duidelijk maken dat je een instance aan het maken bent (lees: een nieuw object creeert uit het prototype van een ander object) en niet gewoon een functie aanroept).
Het idee van een singleton is juist dat je geen nieuw object genereerd; het gebruik van 'new' zou in die context juist verwarrend zijn :)

Intentionally left blank


Verwijderd

crisp schreef op maandag 26 november 2007 @ 08:57:
[...]

Het idee van een singleton is juist dat je geen nieuw object genereerd; het gebruik van 'new' zou in die context juist verwarrend zijn :)
Hier ja, maar ik bedoelde eigenlijk meer in het algemeen
Of doe je dat dan niet? (ik zie anderen het daar ook toepassen namelijk)
Pagina: 1