2010-11-16 16 views
8

So come aggiungere nuovi metodi per ogni oggetto - aumentando di prototipi dell'oggetto:Aumento del prototipo dei nodi elemento DOM?

Object.prototype.foo = function() { }; 

Ma, è possibile definire nuovi metodi per soli nodi elemento DOM? Gli oggetti nodo elemento DOM hanno un prototipo? O forse esiste un prototipo per i nodi DOM in generale?

Oppure gli oggetti prototipo esistono solo per gli oggetti incorporati?

risposta

20

Sì, ma non in tutti i browser. Internet Explorer 8 supporta i prototipi DOM (in una certa misura), così come Firefox, Chrome, Opera e Safari.

HTMLElement.prototype.toggle = function() { 
    this.style.display = this.style.display == 'none' ? '' : 'none'; 
} 

Molti considerano una cattiva pratica estendere gli oggetti DOM tramite il loro prototipo. Kangax ha un grande articolo sull'argomento: http://perfectionkills.com/whats-wrong-with-extending-the-dom/. Tuttavia, i prototipi DOM ci consentono di implementare metodi basati su standard in ambienti che non li supportano ancora, proprio come gli shim per i metodi ECMAScript 5th Edition.

+0

Questo è davvero un grande articolo. Controllerò e riferirò. –

+4

il prototipo di esempio non nasconde l'elemento. È possibile attivare – jscripter

+0

perché solo "HTMLDivElement" perché non aggiungere un prototipo a tutti gli elementi HTML? – vsync

0

Questo è esattamente ciò che fa prototype.js, ma ora è considerato una pratica estremamente negativa. È molto meglio usare wrapper/handler. Nota, l'aumento di QUALSIASI oggetti nativi, in particolare l'oggetto Object, è una cattiva pratica.

lettura:

Whats wrong with extending the DOM
Object.prototype is verboten

Addendum:

Mentre si estende oggetti nativi in ​​piccoli progetti può essere considerato sicuro che verrà effettivamente diventare una pessima habbit. È solo marginalmente meno peggio che sporcare l'ambito globale con funzioni e variabili. Si verificano non solo collisioni di nomi, ma anche collisioni di implementazione. Questo diventerà più evidente più le biblioteche vengono ridistribuite.

Mantenere l'implementazione sui propri oggetti è l'unico modo per evitare QUALSIASI collisione, nome, implementazione o altro.

Tutto ciò che è stato detto, è il vostro lavoro da fare a vostro piacimento, tuttavia non raccomanderò nulla che sia ampiamente accettato come pura pratica scorretta. Attenersi alla mia raccomandazione.

+0

@BGerrissen Puoi spiegare cosa fa esattamente prototype.js? Non ho familiarità con quella libreria. Inoltre, potresti approfondire l'uso di wrapper/handler: cosa intendi con questo? Inoltre, tu dici "aumentare QUALSIASI oggetti nativi, specialmente l'oggetto Object" - ma non lo sto aumentando, ma il suo oggetto prototipo. –

+6

La raccomandazione contro l'aumento di qualsiasi oggetto nativo è la paura, IMO. * Le estensioni String.prototype * sono molto utili, ad esempio, con l'unico potenziale svantaggio di nominare collisioni in futuro. –

+0

a) Questa è un'essenza di OOP, b) JS è completamente orientata agli oggetti.Da quando "adesso"? –

3

In alcuni browser, gli elementi DOM espongono un oggetto prototipo, che può ereditare anche da Object.prototype, ma questo non è universalmente vero (ad esempio, IE non lo è). In generale, gli oggetti host come gli elementi DOM non sono obbligati a farlo; infatti, gli oggetti host non sono vincolati da molte delle regole che si applicano agli oggetti JavaScript nativi, quindi non dovresti mai fare affidamento sugli elementi DOM per supportare questo tipo di cose.

Suggerisco kangax's excellent article on this subject.

+0

@Tim, sto facendo questa domanda perché vorrei rendere più comode le tue funzioni di selezione.Ad esempio, se potessi aggiungere un oggetto 'selec' a nodi di elementi HTML, potrei usare le tue funzioni in questo modo:' input.selec.get(); input.selec.set (5,8); ' –

+1

@ Šime: Ah, giusto. Se stai usando jQuery puoi fare qualcosa di simile aumentando '$ .fn', come fanno i plug-in. Altrimenti, non è possibile in IE senza alcun tipo di elemento wrapper di elementi (come jQuery). –

+0

Fortunatamente per noi, IE si sta finalmente dirigendo nella giusta direzione: gli oggetti DOM di IE 9 ereditano da 'Object.prototype'. @ Il confezionamento di Šime è quasi certamente la strada da percorrere, per ora. –

Problemi correlati