2012-11-27 15 views
5

Stiamo usando una consuetudine libreria JavaScript sul posto di lavoro, dove facciamo questo:soluzione __proto__ per Internet Explorer IE 10

DOM.__proto__ = Library.prototype; 

per trasferire rapidamente interne funzioni/proprietà di oggetti DOM in modo che possa essere utilizzato simile a come jQuery per esempio lo fa.

Per un nuovo progetto è necessario implementarlo per Internet Explorer ma sfortunatamente __proto__ non è supportato da IE.

Qualche idea, soluzione alternativa di polyfill per questo? Il requisito è solo IE10 (ma anche IE9 sarebbe bello).

+0

È molto improbabile avere una buona soluzione. Puoi solo * estendere * il prototipo in IE piuttosto che sostituire/dirottare/iniettare/qualunque sia il prototipo di un altro oggetto. – xiaoyi

+0

Ok, ma come si potrebbe estenderlo in IE? – user1768759

risposta

1

Invece di estendere direttamente l'elemento DOM come sei, puoi avvolgerlo con la tua API;

// Wrapping Constructor 
function Library(element) { 
    this.element = element; 
} 

// Whatever it is your library does 
Library.prototype = { 
    // some example method 
    html: function(markup) { 
    // refer to "this.element" instead of "this" 
    this.element.innerHTML = markup; 
    } 
}; 

// example 
var wrappedElement = new Library(document.getElementById('unique')); 

// refer to the API rather than the Element directly 
wrappedElement.html('<span>Hello World</span>'); 

È inoltre possibile estendere la Biblioteca ancora un po 'da safely subclassing Array with this technique.

Spero che questo aiuti, grazie.

0

Che dire estendendola:

$.extend(Element.constructor.prototype, Library.prototype); 

EDIT: a causa di protesta pubblica, ti faccio notare che extend è un concetto molto familiare nel contesto della programmazione JS nell'anno del 2014. Si può trova online numerosi esempi di cosa è e come funziona, e c'è una buona probabilità che almeno una libreria che usi già nel tuo progetto lo implementa (jQuery, Lo-Dash/Underscore, AngularJS, Ember.js ...)

+0

Anche se 'jQuery' è menzionato nella domanda, è ancora generale e non è correlato a' jQuery', quindi dovresti ancora menzionare che '$ .extend' fa parte della libreria jQuery. Come potrebbe non essere ovvio per ogni lettore. –

+1

@ t.niese A meno che qualcuno non abbia vissuto in una grotta negli ultimi dieci anni, penso che sappiano che '$' indica jQuery. –

+1

@torazaburo ci sono ancora abbastanza persone che non sono in grado di distinguere tra js, jQuery, ... e qui su SO ci sono abbastanza domande che dimostrano che le persone non sanno che stanno usando jQuery quando c'è un '$'. Inoltre '$' non è riservato a jQuery. Mentre è attualmente la libreria di sindaco che non ha bisogno di essere la biblioteca in futuro. Quindi penso ancora che o scrivere 'jQuery.extend()' o dire che è da jQuery sarebbe una buona cosa. –

2

Invece di assegnare a __proto__ dopo aver creato lo 0 Oggetto, utilizzare Object.create (MSDN, supportato da IE9) a creare l'oggetto con il prototipo corretto, quindi assegnarvi le proprietà.

var DOM = {}; 
DOM.__proto__ = Library.prototype;
var DOM = Object.create(Library.prototype);

Se si voleva modificare il prototipo di oggetti esistenti (e forse anche stranieri), basta evitarlo. Comunque è una cattiva pratica.

Problemi correlati