我有以下原型:
Object.prototype.find = function (path, obj = null) { let previous = null; obj = !obj ? this : obj; for (let i = 0, p = path.split(/[\[\]\.]/), len = p.length; i < len; i++) { if (p[i] == '') { continue; } let item = p[i]; obj = obj[item]; previous = obj; } return obj; }
然后我这样称它为:
let data = [ { id: 1 }, { id: 2 } ]; console.log(data.find('[0].id')) // Error refers to this line // The result should return 1
然后我收到以下错误:
未捕获的TypeError:xxx不是函数
为什么它给我这个错误?
你正在调用find
一个数组.这意味着您正在使用本机数组查找方法(因为它比find
您在Object
原型上定义的方法更靠原型链).
数组find方法期望第一个参数是一个函数.
如果你想调用你的find
方法,那么你需要明确地这样做:
Object.prototype.find("xxx", data); // or Object.prototype.find.call(data, "xxx");
...或者给它一个未被Array.prototype上的现有方法掩盖的名称.
(这是为什么扩展原生对象的原型是一个坏主意的一个很好的例子)