codice semplice Javascript per comprendere le basi OOP basate su prototipo [chiuso]

8

Conosco Javascript da un po 'di tempo, anche se non sono un utente pesante, lo conosco il primo dal momento in cui Netscape era il mio browser. Capisco praticamente le cose principali, ma dal momento che l'approccio JavaScript a OOP è un prototipo, ho qualche problema a coglierlo.

Un problema da aggiungere a questo sembra che le cose possano essere fatte in più di un modo, ed è qui che i libri non aiutano molto perché mettono tutti gli esempi sul tavolo rendendo difficile mantenere il ritmo.

Ciò di cui ho bisogno per iniziare è solo un modo per farlo, se qualcuno mi può aiutare con il codice più semplice possibile, un esempio in cui posso vedere come funziona il prototipo del modello OOP?

Per essere utile, il codice dovrebbe avere un oggetto ereditato, accedere alla proprietà di un genitore e alle sue proprietà ereditate e alla funzione di un genitore, sovrascrivere la funzione di un genitore e avere un'istanza di un'ereditarietà multipla dove un oggetto eredita altri due oggetti.

    
posta Eduard Florinescu 18.08.2012 - 00:26
fonte

3 risposte

6

How can be inherited an object?

function inherit(o){ // inherit is called Object.create in modern implementations
    var F= function(){};
    F.prototype=o;
    return new F();
}

var parent = {
    name: "Josh",
    print: function(){
       console.log("Hello, "+this.name);
    }
};
parent.print(); // Hello, Josh
var child = inherit(parent);
child.name = "Jeremy";
parent.print(); //Hello, Josh
child.print();  //Hello, Jeremy

How can I see a parent's property?

console.log(child.__proto__.name); //won't work in IE; also see getPrototypeOf

How can I access a parent's function?

Object.getPrototyepeOf(child).print(); // or
child.print.apply(parent) //functions are just objects, and 'this' pointer can point to wherever you want

How can I overwrite a parent's function?

child.print = function(){
    console.log("Hi ", this.name);
}

parent.print(); //Hello, Josh
child.print();  //Hi, Jeremy

How an object can inherit two objects?

//in chain?

grandchild = inherit(child);

//otherwise, there's no way.
grandchild.name = "Eddie";
grandchild.print();

Vedi anche:

risposta data 18.08.2012 - 00:50
fonte
2

L'esilarante esperto @venkat_s condivide un'analogia per comprendere l'ereditarietà prototipale.

Ecco un esempio del suo umorismo: "La cosa su JavaScript è che non ti urla, è tuo amico, non ti dirà quando qualcosa non funziona, smetterà di funzionare.

Per ereditarietà ha continuato, "Il prototipo è come uno zaino - per l'oggetto.Per tutto in JavaScript è un oggetto - ha uno zaino, e puoi mettere tutto dentro e tutti i tuoi oggetti possono accedervi. "

Spero che ti aiuti.

    
risposta data 19.08.2012 - 02:44
fonte
2

Dimentica il codice. La spiegazione più semplice.

I costruttori di funzioni costruiscono oggetti. In JS, le funzioni sono esse stesse oggetti che possono avere proprietà. Ogni funzione ha una proprietà prototipo che può contenere qualsiasi oggetto. È possibile impostare facilmente qualsiasi prototipo di costruttore al volo. Ad esempio, se vuoi rovinare gli array,

Array.prototype = {
    oneTrueMethodToRuleThemAll: function(){
        alert('arrays are now hosed');
    }
}

L'oggetto prototipo è fondamentalmente un fallback che viene controllato dalle istanze quando si tenta di fare riferimento a una proprietà che non hanno. Se l'oggetto prototipo non ha quel metodo, l'oggetto prototipo del suo costruttore viene controllato per il metodo. Questa è la catena che viene seguita.

Quindi non si tratta di ereditarietà. Si tratta di "Oh, non ce l'hai, beh, tua madre ce l'ha nella sua borsa prototipo?" No? E sua nonna? No? Allora che ne dici ... fino a che non arriviamo a Eve, o al prototipo del Costruttore Oggetto che è dove il dollaro si ferma sempre.

Quindi non è che le tue istanze raccolgono o conservano le cose nel prototipo. È solo che quando JavaScript chiama un metodo di un oggetto esiste un processo di fallback per controllare la catena constructor.prototype di object- > per vedere se è possibile trovare il metodo sconosciuto. Ed è per questo che quando si modifica un prototipo di costruttore, tutte le istanze esistenti "ottengono" quel metodo. Non hanno davvero niente. È il set di fallback di oggetti per la ricerca che ottiene il nuovo metodo.

    
risposta data 21.01.2013 - 15:30
fonte

Leggi altre domande sui tag