Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Chain Prototype

  1. #1
    Utente di HTML.it L'avatar di Scam
    Registrato dal
    Jul 2009
    Messaggi
    7

    Chain Prototype

    Ciao a tutti volevo porgervi un mio dilemma che ormai mi perseguita da troppo tempo sto costruendo un frame work javascript per puro piacere personale e ho gia ottenuto risultati ma c'e una cosa che non riesco a ricolvere:
    Allora dopo la definizione della variabile e del prototype io dichiaro le funzioni come segue:


    (function(){
    var
    window = this,
    JSB = window.JSB = window.$ = function( selector, context ) {

    return new JSB.init( selector, context );
    },
    quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/;

    JSB = JSB.prototype =
    {
    init: function (selector, context){
    if ( typeof selector === "string" ) {

    var match = quickExpr.exec( selector );
    }
    return this;

    },
    test: function (){alert('test');}
    }
    JSB.init.prototype = JSB;
    })();




    E fin qui nessun problema per poterla usare dichiaro nella pagina l 'include e la lancio in questo modo:

    window.onload = function(){ $().test();}

    Bene qui viene il problema io vorrei poter lanciare il metodo test senza dover mettere $() quindi senza le parentesi in pratica vorrei fare $.test() ma ogni volta mi viene detto che non e una funzione.
    Qulacuno di voi sa dirmi perche?
    Grazie in anticipo per l'aiuto.

  2. #2
    beh, perché l'hai messo come prototype, che rappresenta in sostanza il metodo pubblico, quindi devi instanziare l'oggetto del tipo JSB (o $ che sono la stessa cosa).

    dovresti fare:

    codice:
    (function(){
    var
    window = this,
    JSB = window.JSB = window.$ = function( selector, context ) {
    
    return new JSB.init( selector, context );
    },
    quickExpr = /^[^<]*(<(.|\s)+> )[^>]*$|^#([\w-]+)$/;
    
    JSB = JSB.prototype =
    {
    init: function (selector, context){
    if ( typeof selector === "string" ) {
    
    var match = quickExpr.exec( selector );
    }
    return this;
    
    }
    }
    JSB.init.prototype = JSB;
    
    window.$.test =  function (){alert('test');}
    
    })();
    In questo modo è statico, ovvero non richiede l'instanziazione per essere chiamato. Quello che perde rispetto un metodo pubblico è che non puoi chiamare il this al suo interno perché il contesto della funzione deve essere statico.
    I DON'T Double Click!

  3. #3
    Utente di HTML.it L'avatar di Scam
    Registrato dal
    Jul 2009
    Messaggi
    7
    Grazie per la risposta per facendo cis non ho piu l'ereditabilità chain che vorrei in pratica se faccio cosi non posso piu scrivere $().test.
    Altre soluzioni?

  4. #4
    Utente di HTML.it L'avatar di Scam
    Registrato dal
    Jul 2009
    Messaggi
    7
    Grazie a tutti per le risposte ho risolto.

  5. #5
    eh, come hai risolto? Il forum fa anche da repository per le soluzioni (se cerchi in Google l'argomento di una discussione di un paio di giorni fa la trovi tra le prime posizioni), quindi se risolvi scrivi il come
    I DON'T Double Click!

  6. #6
    Utente di HTML.it L'avatar di Scam
    Registrato dal
    Jul 2009
    Messaggi
    7
    Eccomi allora scusate se non ho scritto subito la risposta ma essendo a lavoro ho dovuto rispondere di fretta in pratica la soluzione l'ho trovata seguendo uno dei vostri consigli ora posto il codice risolutivo:

    // Creazione pseudo classe prototype
    JSB = JSB.prototype =
    {
    // Costruttore classe
    init: function ( selector ){
    return this;
    },
    test: function(){$.test();}
    }

    // IMPORTANTE PER IL CHAINING ad ogni chiamata del costruttore passo l'eredità dei metodi della classe
    JSB.init.prototype = JSB;

    //Funzione publica che non richiede di essere chiamata tramite il costruttore
    window.$.test = function (){
    alert('ok');
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.