2011-11-25 11 views
9

Co zaskakujące, this Apple page ma równą , więc nie mogę użyć tego awesome snippet of code.Dlaczego Element.prototype jest niezdefiniowany?

Czy jest jakiś powód, aby to zrobić?

+3

'Element.prototype === undefined' to porównanie. To nic nie robi. – Tomalak

+1

Nie wiem, dlaczego tak jest, ale można użyć HTMLElement zamiast elementu w tym fragmencie. – pradeek

+0

Możesz znaleźć [ten artykuł] (http://perfectionkills.com/whats-wrong-with-extending-the-dom/) zainteresowania. – smendola

Odpowiedz

8

Apple jest za pomocą ramy Spójne JS, który ma tę block of code:

// Trick picked up from Prototype to get around IE8's fixed Element & Event 
(function() { 
    var element = this.Element; 
    this.Element = {}; 
    Object.extend(this.Element, element || {}); 
}).call(window); 

window.Element jest pierwotnie funkcję, ale jest zastępowane i rozszerzony o regularnym obiektu. Tylko funkcje mają właściwości .prototype.

Obejście:

łańcucha prototypów dla każdego elementu HTML wydaje się być:

  • Specjalny typ elementu (HTMLBodyElement, HTMLDivElement, etc ...)
  • HTMLElement
  • Element
  • Węzeł
  • Object

Powinieneś być w stanie dołączyć swój kod odwołuje się do prototypu któregokolwiek z pogrubioną obiektów w sieci i uzyskać styl do elementu HTML. Nie polecam tego w kodzie produkcyjnym, ponieważ takie obiekty modyfikujące są generalnie takie jak: considered harmful, ale jeśli próbujesz wyeksportować styl z innej witryny, powinien on działać wystarczająco dobrze.

Object.prototype.exportStyles = (function() { //Works if you use it on an element, the code will protect you from yourself if you try to use it on regular objects. 
HTMLElement.prototype.exportStyles = (function() { //Safer because it is farther down the inheritance line, affecting fewer objects. 
                 //Avoiding name collisions and other surprises. 
0

Wygląda na to, że nadpisały domyślną wartość elementu i przypisały mu wartość instancji obiektu, która domyślnie nie ma właściwości prototypu. Spróbuj wykonać następujące czynności w konsoli:

var a = {}; 
console.log(typeof a.prototype === 'undefined'); 

function abc() {} 
Element = abc; 
var b = new Element(); 
console.log(typeof b.prototype === 'undefined'); 

Nie jest uniwersalnym powód, aby zastąpić funkcje wbudowane, tak że myślę, że to prawdopodobnie dlatego, że myślał, że jak najwięcej sensu semantycznie (jak wydaje się, że Element obiekt służy do manipulacji DOM) i nie ma możliwości konfliktu z bibliotekami zewnętrznymi, dlatego zazwyczaj jest odradzany.

1

Oprócz tego, co Dennis wyjaśnił również, najprostszym rozwiązaniem, aby uniknąć zmieniania wbudowanych obiektów (które ludzie wydają się lubią robić w kółko, jak Apple zrobił na ich miejscu i Luc1245 zrobił w posta wspomniano).

nieinwazyjne alternatywą jest uruchomienie coś takiego:

function exportStyles = (function (/* what Luc1245 posted */; 

exportStyles.apply(/* this */ theElement, /* args */ []); 
+0

Powinieneś dodać taką odpowiedź do połączonego pytania. –

Powiązane problemy