2015-08-23 25 views
5

Opracowuję UserScript i pomyślałem, że zaoszczędzenie czasu na stworzenie 2 funkcji Prototype dla Object.UserScript - problem z Object.prototype

Object.prototype.Count = function() { 
    var size = 0, key; 
    for (key in this) { 
     if (this.hasOwnProperty(key)) { 
      size++; 
     } 
    } 
    return size; 
}; 
Object.prototype.GetEntry = function(index) { 
    var size = 0, key; 
    for (key in this) { 
     if (this.hasOwnProperty(key)) { 
      if (size == index) 
       return this[key]; 
      size++; 
     } 
    } 
    return null; 
}; 

tego 2 Funkcje pracują perfekcyjnie na mojej konsoli Debug, jak i ich rodzaj, a ich używać, jednak kiedy biegnę mój skrypt, to trochę dziwne błędy zalewa moją konsolę.

Uncaught TypeError: U[a].exec is not a function 
Uncaught TypeError: (ec[b] || []).concat is not a function 
Uncaught TypeError: X[g].exec is not a function 
Uncaught TypeError: (Qn[t] || []).concat is not a function 

Co więcej, nie działa funkcja JavaScript witryny.

Bez tych funkcji mój skrypt działa jak urok. Mam też na więcej Prototype na ciąg, ale to działa dobrze

String.prototype.between = function(prefix, suffix) { 
    s = this; 
    var i = s.indexOf(prefix); 
    if (i >= 0) { 
     s = s.substring(i + prefix.length); 
    } 
    else { 
     return ''; 
    } 
    if (suffix) { 
     i = s.indexOf(suffix); 
     if (i >= 0) { 
      s = s.substring(0, i); 
     } 
     else { 
      return ''; 
     } 
    } 
    return s; 
} 

W moim userscript jestem tym

  1. jQuery UI 1.11.4
  2. jQuery 1.11.1
  3. Bootstrap 3.3.5

Naprawdę nie rozumiem, o co chodzi, ponieważ na konsoli do debugowania działa bez błędów.

+0

możliwe duplikat [Jak definiować metody w javascript na Array.prototype i Object.prototype tak, że nie robi” t pojawiają się w for w pętli] (http://stackoverflow.com/q/13296340/1048572) – Bergi

Odpowiedz

8

Zakładam, że to tylko konflikt jQuery z natywnym prototypem.

Więc tylko obejście mogę znaleźć to, aby zdefiniować właściwości stosując

Object.defineProperty(Object.prototype, 'Count ',{ 
    value : function() {}, 
    enumerable : false 
}); 

Object.defineProperty(Object.prototype, 'GetEntry ',{ 
    value : function() {}, 
    enumerable : false 
}); 

jQuery conflict with native prototype.

+0

Cóż ... Myślałem, że jQuery.noConflict() ... powinien działać na tym, próbowałem go, ale to nie pracował. Może to być fakt, że witryna używa własnego jQuery, więc ... rzeczy stają się niechlujne. Dziękuję za tę odpowiedź. Rozwiązał problem, a poza tym nauczyłem się nowego sposobu deklarowania prototypów. – Devian

+0

Należy zauważyć, że powyższe rozwiązanie nie zadziała na IE8 (przynajmniej tak nie było w moich testach). –