2017-01-17 1 views
0

되지 않습니다 :매개 변수 : 'XXX'는 내가 다음과 같은 프로토 타입이 함수

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 

내가 다음 오류가 점점 오전 :

Uncaught TypeError: xxx is not a function

왜이 오류가 발생합니까?

+1

http://jsbin.com/tufuqoz/1/edit?js,console (이 왜 기본 객체의 프로토 타입을 확장하는 좋은 예 나쁜 생각입니다) 문제 ('xxx'는 함수가 아니기 때문에 이것은 아마도 당신이 우리와 공유하지 않은 함수 안에서'path'를 사용하는 것과 관련이 있습니다); – Quentin

+0

함수를 실행하는 것조차 없다, 나는 새롭게 할 것이다. 1 초 ... –

+0

아니요, 아약스 요청 응답이었습니다. 나는 그것을 단순화하기 위해 그것을 업데이트했다. –

답변

7

어레이에서 find으로 전화를 걸고 있습니다. 즉, the native array find method (Object 프로토 타입에 정의한 find 메서드보다 프로토 타입 체인에서 더 아래에 있기 때문에)입니다.

배열 찾기 메서드는 첫 번째 인수가 함수가 될 것으로 예상합니다.

Object.prototype.find("xxx", data); // or 
Object.prototype.find.call(data, "xxx"); 

을 ... 나에게 Array.prototype으로의 기존 방법에 의해 마스크되지 않은 이름을 :

당신이 당신의 find 메소드를 호출 할 경우

는 그렇게 명시 적으로 할 중 하나가 필요합니다. 나는를 재현 할 수없는 -

+0

와우! 나는 결코 그것을 생각하지 않았다, 그 문제를 해결한다! –

+0

그리고 명시 적으로 참조하고 있으므로 처음부터 프로토 타입에 추가 할 이유가 없습니다. – loganfsmyth

관련 문제