2017-02-14 19 views
0

Я получаю несколько ошибок типа всякий раз, когда добавляю перечислимую функцию прототипу объекта.Uncaught TypeError при добавлении перечислимой функции прототипу объекта

jquery-1.10.2.js:2451 Uncaught TypeError: matchExpr[type].exec is not a function 
    at tokenize (jquery-1.10.2.js:2451) 
    at Function.Sizzle [as find] (jquery-1.10.2.js:1269) 
    at init.find (jquery-1.10.2.js:5744) 
    at change-project-controller.js:4 
    at change-project-controller.js:255 
tokenize @ jquery-1.10.2.js:2451 
Sizzle @ jquery-1.10.2.js:1269 
find @ jquery-1.10.2.js:5744 
(anonymous) @ change-project-controller.js:4 
(anonymous) @ change-project-controller.js:255 

jquery-1.10.2.js:2451 Uncaught TypeError: matchExpr[type].exec is not a function 
    at tokenize (jquery-1.10.2.js:2451) 
    at Function.Sizzle [as find] (jquery-1.10.2.js:1269) 
    at init.find (jquery-1.10.2.js:5744) 
    at filter-by-registrant-controller.js:10 
    at filter-by-registrant-controller.js:179 
tokenize @ jquery-1.10.2.js:2451 
Sizzle @ jquery-1.10.2.js:1269 
find @ jquery-1.10.2.js:5744 
(anonymous) @ filter-by-registrant-controller.js:10 
(anonymous) @ filter-by-registrant-controller.js:179 

jquery-1.10.2.js:2451 Uncaught TypeError: matchExpr[type].exec is not a function 
    at tokenize (jquery-1.10.2.js:2451) 
    at Function.Sizzle [as find] (jquery-1.10.2.js:1269) 
    at init.find (jquery-1.10.2.js:5744) 
    at registrations-controller.js:6 
    at registrations-controller.js:412 
tokenize @ jquery-1.10.2.js:2451 
Sizzle @ jquery-1.10.2.js:1269 
find @ jquery-1.10.2.js:5744 
(anonymous) @ registrations-controller.js:6 
(anonymous) @ registrations-controller.js:412 

Index:290 Uncaught TypeError: Cannot read property 'registerFilter' of undefined 
    at Index:290 
(anonymous) @ Index:290 

Обратите внимание, что последняя из четырех ошибок не имеет никакого отношения к jQuery.

Это код, который приводит к возникновению ошибки:

Object.defineProperty(Object.prototype, "select", { 

    enumerable: true, 
    value: function() { 

     return "hello world"; 

    } 

}); 

Я не получаю ошибки, если добавить функцию как не перечислимы, как это:

Object.defineProperty(Object.prototype, "select", { 

    enumerable: false, 
    value: function() { 

     return "hello world"; 

    } 

}); 

Обратите внимание, что Единственное отличие состоит в том, что перечисляемый элемент установлен в false. Кроме того, если я изменяю перечислимую функцию, добавляемую в Array, а не Object, код работает нормально.

Проект, над которым я работаю, не является моим, поэтому я не могу поделиться им, и мне не удалось воспроизвести ошибку в jsfiddle или в простом HTML-файле.

ответ

1

Я получаю несколько ошибок типа всякий раз, когда я добавляю перечислимую функцию прототипу объекта.

Не делайте этого. Как вы нашли, это нарушит много ничего не подозревающего кода. Состояние дел по умолчанию состоит в том, что пустой объект не имеет перечислимых свойств. Например:

var o = {}; 
 
for (var name in o) { 
 
    console.log("This line never runs in a reasonable world."); 
 
} 
 
console.log("End");

Добавляя перечислимую свойство Object.prototype, вы нарушаете, что:

Object.prototype.foo = function() { }; 
 
var o = {}; 
 
for (var name in o) { 
 
    console.log("I wasn't expecting to find: " + name); 
 
} 
 
console.log("End");

Добавление вещей Object.prototype почти никогда не является хорошей идеей , Добавление перечислимое вещей к нему всегда Плохая идея. Все современные браузеры поддерживают defineProperty, поэтому, если вы должны augment Object.prototype, сделайте это с неисчислимыми свойствами. (Заметьте, однако, что легко ввести несовместимости даже с неперечислимыми свойствами Object.prototype.) Если вам нужно поддерживать устаревшие браузеры, которые его не поддерживают, вам нужно оставить только Object.prototype.

+0

Я понимаю, что вы имеете в виду, и я полностью уважаю это. Однако я обеспокоен тем, почему моя функция registerFilter внезапно исчезнет, ​​потому что я добавляю перечислимую функцию. Есть идеи? –

+0

@RobinTheilade: Я боюсь это понять, нам нужно иметь MCVE, о котором вы сказали, что не смогли создать. По сути, что-то, где-то, сбивается с вопроса выше, и это имеет эффект постукивания, вызывающий ошибку, которую вы видите. Единственный способ узнать наверняка - продолжать создавать MCVE (как в процессе этого, вы, вероятно, выясните это). Но это вряд ли будет полезным способом провести время; в принципе, просто не добавляйте перечисления в корневой прототип. :-) –