参数:'xxx'不是函数

Get*_*awn 0 javascript ecmascript-6

我有以下原型:

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;
}
Run Code Online (Sandbox Code Playgroud)

然后我这样称它为:

let data = [
    {
        id: 1    
    },
    {
        id: 2
    }
];

console.log(data.find('[0].id')) // Error refers to this line
// The result should return 1
Run Code Online (Sandbox Code Playgroud)

然后我收到以下错误:

未捕获的TypeError:xxx不是函数

为什么它给我这个错误?

Que*_*tin 7

你正在调用find一个数组.这意味着您正在使用本机数组查找方法(因为它比find您在Object原型上定义的方法更靠原型链).

数组find方法期望第一个参数是一个函数.

如果你想调用你的find方法,那么你需要明确地这样做:

Object.prototype.find("xxx", data); // or
Object.prototype.find.call(data, "xxx");
Run Code Online (Sandbox Code Playgroud)

...或者给它一个未被Array.prototype上的现有方法掩盖的名称.

(这是为什么扩展原生对象的原型是一个坏主意的一个很好的例子)