每当向Object原型添加可枚举的函数时,我都会遇到一些类型错误。

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。另外,如果我更改要添加到数组而不是对象的可枚举函数,则代码可以正常运行。

我正在处理的项目不是我的项目,因此我无法共享它,并且无法成功在jsfiddle或简单的HTML文件中重现错误。

最佳答案

每当向Object原型添加可枚举的函数时,我都会遇到一些类型错误。


不要那样做正如您所发现的那样,这样做会破坏很多毫无疑问的代码。事物的默认状态是空白对象没有可枚举的属性。例如。:



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几乎从来不是一个好主意。向其中添加难以计数的东西始终是Bad Idea™。所有现代浏览器都支持defineProperty,因此,如果必须扩展Object.prototype,请使用不可枚举的属性来实现。 (但是请注意,即使使用不可枚举的Object.prototype属性,也很容易引入不兼容性。)如果需要支持不支持它的过时浏览器,则必须将Object.prototype保留下来。

关于javascript - 向对象原型(prototype)添加可枚举函数时出现TypeError未被捕获,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42223826/

10-09 23:26