Pagina 4 di 7 primaprima ... 2 3 4 5 6 ... ultimoultimo
Visualizzazione dei risultati da 31 a 40 su 64
  1. #31
    Ti stai accanendo inutilmente, mischi cose che non centrano niente.
    Javascript è un linguaggio diverso da Java, nessuno ha mai detto che l'ereditarietà e simile.
    javascript ha una "ereditarietà" finta, simulata, o quello che vuoi.
    Qui invece hai fatto una buona deduzione
    Usare call/apply non è come una vera e propria ereditarietà, al limite è una ereditarietà simulata,
    non a caso ciò che fanno è utilizzare una funzione come fosse un metodo dell'oggetto che passi.

    E' un pò macchinoso tale sistema ma funziona abbastanza bene

  2. #32
    Utente di HTML.it L'avatar di Linusss
    Registrato dal
    Sep 2002
    Messaggi
    405
    Non mi sto accanendo, sto solo cercando di capire.
    Java è il re dei OOP, parere mio ovviamente, e l'ereditarietà permette di ereditare(e non condividere) metodi e attributi della classe generatrice.
    Javascript con quel pezzo di codice non lo faceva, tutto qui, io l'ho solo fatto notare e mi è stato gentilmente consigliato di riguardami cosa singifica ereditarietà... come se fosse normale che ci sia una condivisone di variabili.
    Forum Additive monitora le discussioni più importanti!

  3. #33
    codice:
    function Pippo(){
    
    	var	pippo	= 123;
    	
    	this.get	= function(){
    		return	pippo;
    	};
    
    	this.set	= function(){
    		pippo	= 456;
    	};
    };
    
    var	a = new Pippo,
    	b = new Pippo;
    
    b.set();
    alert(b.get());	// 456, of course
    alert(a.get());	// 123, of course
    ma pippo non doveva essere condivisa? :master:


    Ancora, se usi metodi privilegiati, non stai usando l'ereditarietà JavaScript, che è un linguaggio a prototipi.

    Cosa significa questo? Significa che di fatto non puoi veramente estendere Pippo perchè non stai utilizzando l'ereditarietà nativa di JavaScript.

    Se tu assegni una prototype, che è un oggetto, dove gli oggetti non sono mai copie se non forzatamente ricostruiti, di fatto starai lavorando su un'unica istanza di Pippo.
    codice:
    function Pluto(){};
    Pluto.prototype = Pippo.prototype;
    alert((new Pluto) instanceof Pippo);
    alert((new Pluto) instanceof Pluto);
    Questo esempio mostra la vera ereditarietà JavaScript, dove il risultato sarà true in entrambi gli alert.

    Cosa significa? ... significa che JavaScript supporta l'ereditarietà ma in modo diverso, e dire che Java è il RE dell'OOP significa far sbellicare dalle risate migliaia di sviluppatori ... ma non voglio spendere una sola unica parola sull'argomento, anche il discorso del polimorfismo mi ha fatto sorridere ... ed anche quello del JavaScript senza tipi di dati ... ma lasciamo perdere, continuiamo con il discorso dei privilegiati.

    Nell'ultimo esempio vedi che Pluto ha un costruttore vuoto, e non avendo specificato i metodi in prototype di Pippo, è vero che lo estendi, come è vero che i metodi privilegiati get e set, interni al costruttore, non saranno ereditati.

    Cosa succede allora se faccio questo?
    codice:
    function Pluto(){};
    Pluto.prototype = new Pippo;
    Succede che come prototype avrai un'istanza di Pippo, ma non la prototype nativa di Pippo.
    Ergo la prototype è un'istanza con metodi privilegiati che overloadano la prototype, il che significa che ogni istanza di questo costruttore, che estende un'istanza, modificherà l'istanza stessa perchè è come usassi tanti riferimenti diversi ad un'unica istanza (new Pippo) perchè non sfrutti prototype ma privilegeds.

    Cosa significa? Significa che più che condividere, semplicemente utilizzano tutti i metodi di quell'istanza. Paradossalmente puoi usare il sistema per un singleton, sempre ricordandosi che a loro volta sono istanze di Pluto e che se modifichi la proprietà di una, senza passare per i metodi definiti dall'istanza di new Pippo, perdi consistenza.

    Ma uno che venera Java, dove tutto è getter / setter, questo non dovrebbe essere un problema, l'unico che hai, è voler pretendere di sapere tutto sulla programmazione ad oggetti perchè conosci Java ... fatti un giro in Python, PHP, C# ... e passa di volta in volta per JavaScript 3rd edition ... c'è da divertirsi, te lo assicuro

    P.S. leggi qui prima: http://javascript.crockford.com/prototypal.html e qui poi http://javascript.crockford.com/javascript.html
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  4. #34
    ok, mi sono riletto poi e forse non è tutto chiaro ... proverò a spiegare quella che è definita sopra falsa eredità in modo migliore, poichè di falso non ha assolutamente niente, expected behaviour, sarebbe falso il contrario.

    Ricominciamo da capo ... per avere una variabile privata, sono "costretto" a dover usare metodi privilegiati
    codice:
    function Pippo(){
    	var	pippo	= 123;
    	this.get	= function(){
    		return	pippo;
    	};
    	this.set	= function(value){
    		pippo	= value;
    	};
    };
    questi metodi, assieme alla variabile, hanno uno scope, che è il costruttore Pippo.
    Non essendo metodi di prototype, vengono chiamati privilegiati, perchè ammesso scriva qualcosa tipo:
    codice:
    Pippo.prototype.get = function(){return 1};
    ogni istanza di Pippo erediterà prima la prototype, poi la sua ridefinizione all'interno del costruttore.
    codice:
    alert((new Pippo).get()); // 123
    Questa è l'eredità JavaScript 3rd edition, 1999 ... ai miei occhi non fa una piega, ma è differente da altri tipi di eredità, perchè gli altri tipi non si basano sui prototipi e non hanno concetti come metodi privilegiati.

    Fino a qui è tutto chiaro? ... bene, passiamo oltre.

    I metodi privilegiati sono diversi per ogni istanza.
    codice:
    var	a = new Pippo,
    	b = new Pippo;
    alert(a.get === b.get);	// false
    Questo comportamento è normale perchè ogni istanza avrà definiti runtime quei due metodi.

    per farla breve, è come se scrivessi:
    codice:
    function Test(){};
    var	a = new Test,
    	b = new Test;
    a.get = function(){return 1};
    b.get = function(){return 1};
    alert(a.get === b.get);	// false
    Quindi, tornando al costruttore Pippo, ogni istanza crea due metodi che lavorano in uno scope privato, dell'istanza, assieme alle variabili definite nello stesso scope, nel nostro caso, pippo.

    Fin qui è tutto chiaro? 2 istanze, 4 funzioni create runtime più 2 variabli per 2 scopes differenti.

    Questo è il motivo percui quando si vuole sfruttare JS al meglio, inteso come performances, è consigliabile usare l'ereditarietà senza privilegiati, che altro non fanno che overloadare i metodi di prototype (ho detto overloadare? VVoVe: )

    codice:
    function Pippo(){
    	this.pippo	= 123;
    };
    Pippo.prototype.get	= function(){return this.pippo};
    Pippo.prototype.set	= function(value){this.pippo = value};
    
    var	a = new Pippo,
    	b = new Pippo;
    alert(a.get === b.get);	// true
    a.set(456);
    alert(a.get());	// 456
    alert(b.get());	// 123
    Bene, a questo punto possiamo anche fare una cosa di questo tipo:
    codice:
    // codice di prima
    
    function Pluto(){};
    Pluto.prototype	= new Pippo;
    
    var	c = new Pluto,
    	d = new Pluto;
    c.set(9);
    alert(c.get());			// 9
    alert(d.get());			// 123
    alert(a.get());			// 456
    alert(b.get());			// 123
    alert(c instanceof Pippo);	// true
    alert(c instanceof Pluto);	// true
    alert(d.get === a.get);		// true
    Tutto ok? ... perfetto!

    Torniamo all'anomalia che anomalia non è ... ripartendo da zero:
    codice:
    function Pippo(){
    	var	pippo	= 123;
    	this.get	= function(){
    		return	pippo;
    	};
    	this.set	= function(value){
    		pippo	= value;
    	};
    };
    Se con questo costruttore creo un'istanza, creerò automaticamente due funzioni più una variabile che appartengono a quella sola istanza.
    codice:
    var a = new Pippo;
    A questo punto tutte le volte che scriverò
    codice:
    a.set(someValue);
    è assolutamente naturale e logico che la variabile che andrò a mutare sarà quella pippo, di quello scope, di quella istanza ... una e sempre una.

    Ok ??? bene ... ora cosa accade se assegno il tutto ad una prototype?
    codice:
    function Pluto(){};
    Pluto.prototype = new Pippo;
    La prototype in questione sarà un'istanza della classe Pippo con metodi privilegiati, ergo sarà tale quale la variabile a precedentemente istanziata.

    Cosa significa? Significa che ogni istanza di Pluto avrà in prototype un'istanza di Pippo, con quella variabile, quelle due funzioni, appartenenti tutte ad un unico scope, di qui il divertimento del linguaggio, che non ha niente da rimpiangere, ma tanto di divertente e tanto ancora da imparare.

    Ogni istanza di Pluto, quindi, utilizzerà i metodi di un'istanza di Pippo. Per fare un sunto, è come se scrivessimo esattamente questo
    codice:
    function Pippo(){
    	var	pippo	= 123;
    	this.get	= function(){
    		return	pippo;
    	};
    	this.set	= function(value){
    		pippo	= value;
    	};
    };
    var	prototype	= new Pippo;
    
    function Pluto(){};
    Pluto.prototype		= prototype;
    
    var	p		= new Pluto;
    
    alert(p.get === prototype.get);	// true
    p.set(456);
    
    var	p2		= new Pluto;
    alert(p2.get());		// 456
    JavaScript, sei uno spettacolo, e raramente ho visto linguaggi più Object Oriented, sempre che questa frase abbia un senso ... buoni studi ed approfondimenti a tutti
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  5. #35
    Utente di HTML.it L'avatar di Linusss
    Registrato dal
    Sep 2002
    Messaggi
    405
    Originariamente inviato da andr3a
    codice:
    function Pippo(){
    
    	var	pippo	= 123;
    	
    	this.get	= function(){
    		return	pippo;
    	};
    
    	this.set	= function(){
    		pippo	= 456;
    	};
    };
    
    var	a = new Pippo,
    	b = new Pippo;
    
    b.set();
    alert(b.get());	// 456, of course
    alert(a.get());	// 123, of course
    ma pippo non doveva essere condivisa? :master:
    Guarda che io parlavo di Classi(anzi oggetti visto che a quanto pare non esistono le classi in javascript) estese, e quindi di due istanze di esse.
    Non di due istanze di una "classe" fine a se stesso.
    Questo esempio non serve a nulla.

    cut
    Ma uno che venera Java, dove tutto è getter / setter, questo non dovrebbe essere un problema, l'unico che hai, è voler pretendere di sapere tutto sulla programmazione ad oggetti perchè conosci Java ... fatti un giro in Python, PHP, C# ... e passa di volta in volta per JavaScript 3rd edition ... c'è da divertirsi, te lo assicuro

    P.S. leggi qui prima: http://javascript.crockford.com/prototypal.html e qui poi http://javascript.crockford.com/javascript.html
    Penso di sapere tutto? Ma quando mai?
    Sul discorso che ti sbellichi dal ridere ci sarebbe anche da dire qualcosa...


    Poi leggo il resto...anzi ho già intravisto qualcosa e non resisto,

    JavaScript, sei uno spettacolo, e raramente ho visto linguaggi più Object Oriented, sempre che questa frase abbia un senso
    Mi chiedo come fai a dire una cosa del genere pensando di essere preso sul serio...
    Forum Additive monitora le discussioni più importanti!

  6. #36
    Originariamente inviato da andr3a
    JavaScript, sei uno spettacolo, e raramente ho visto linguaggi più Object Oriented, sempre che questa frase abbia un senso ... buoni studi ed approfondimenti a tutti

    Grazie quando ti prendono queste cisti
    ci fai impazzire




    @Linusss

    Hai chiesto AIUTO in questo forum e ti è stato dato
    in abbondanza sebbene tu abbia dato a qc dell'incompetente
    abbi il buon senso per lo meno di ringraziare una persona che ha perso parte del suo tempo per spiegarti come funzionano
    le cose in js per il tuo attegiamento non ho PAROLE
    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  7. #37
    Originariamente inviato da Linusss
    Mi chiedo come fai a dire una cosa del genere pensando di essere preso sul serio...
    semplicemente quello che chiami il linguaggio più OO che c'è è il primo che ho studio in casa base ... poi ho conosciuto gli altri ... e posso permettermi di dire quello che ho detto.

    P.S. in JavaScript ci sono i costruttori, dire non ci sono le classi ma ci sono gli oggetti, significa non conoscere il JavaScript ... quando ti dicevo di studiarlo, invece di presupporre di conoscerlo già o di poter dire "questo non ha senso" o "l'ereditarietà è falsa" o baggianate di questo tipo, intendevo proprio dire studialo, perchè non è Java, ma il 99% di quello che c'è segue una logica assolutamente perfetta, per la sua natura ... ma bisogna conoscerlo, e non mi sembri una persona predisposta a farlo, dato che di 50 righe ne quoti 2 e ignori il resto, che tu ovviamente, dati i precedenti posts, non conoscevi.

    Non è che è una colpa tua o una tua mancanza, semplicemente devi studiarti il JS come tutti qui facciamo tutti i giorni
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  8. #38
    Originariamente inviato da Mega69
    Usare call/apply non è come una vera e propria ereditarietà, al limite è una ereditarietà simulata
    scusa Mega, ma come JS ha call ed apply Java, PHP, C# e compagnia bella hanno l'invoke.

    Poi, grazie al polimorfismo (secondo lui inesistente) in verità onnipresente
    Wikipedia
    In un linguaggio non tipizzato, tutte le espressioni sono intrinsecamente polimorfiche
    (frase che non condivido del tutto poichè è grazie al tipo condiviso, Object, che il polimorfismo diventa intrinseco), è possibile usare metodi di un'istanza di Pippo con un'istanza di Pluto, anche se nessuno dei due costruttori estende l'altro e/o ha a che fare con l'altro (ma essendo tutti instanceof Object, trovo più corretto questo comportamento che quello di altri linguaggi, imperatori o meno dell'OOP)

    Perdona la precisazione
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  9. #39
    Cambio discorso andiamo sul pratico e +
    terra terra ma in questo esempio di Diaz
    Codice PHP:
    Function.prototype.method = function (namefunc) {
        
    this.prototype[name] = func;
        
    //return this;
    };
    /*function Parenizor(value) {
        this.setValue(value);
    }*/
    function Parenizor() {}
    Parenizor.method('setValue', function (value) {
        
    this.value value;
       
    // return this;
    });

    Parenizor.method('getValue', function () {
        return 
    this.value;
    });

    Parenizor.method('toString', function () {
        return 
    '(' this.getValue() + ')';
    });

    myParenizor = new Parenizor();
    myParenizor.setValue(3);
    myString myParenizor.toString();
    alert(myString); 
    perchè mette il return this che per me non ci incastra ?
    (e togliendolo per altro la cosa funziona)

    mi perdo qc


    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  10. #40
    si una riga sotto

    It returns this. When I write a method that doesn't need to return a value, I usually have it return this. It allows for a cascade-style of programming.
    ad ogni modo inherit è veramente tosto e molto
    ostico da digerire alla prossima


    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

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 © 2025 vBulletin Solutions, Inc. All rights reserved.