2010-12-03 5 views
13

이것은 아마도 어리석은 질문이므로 나와 함께하시기 바랍니다.JavaScript의 생성자 대신 toString()을 사용합니다.

왜 toString()을 "[object 함수]"와 비교하여 객체가 함수인지 테스트하는 예제가 많이 있습니까? 예를 들어

:

function isFunction(obj) { 
    return Object.prototype.toString.call(obj) == "[object Function]"; 
} 

우리는 instanceof Function 또는 obj.constructor === Function 사용할 수 없습니다? 브라우저 간 호환이 가능하지 않습니까?

은 비효율적인데 인 것 같습니다. 왜?

+0

중복 가능성 (http://stackoverflow.com/questions/3514336/jquerys-isfunction-and-internetexplorer) –

답변

7

짧은 답변은 typeof /foo/이 Webkit 브라우저의 기능이기 때문입니다. Zuriy가 지적 하듯 때문에 CMS가 jQuery's isFunction and InternetExplorer

그리고 instanceOf @ 긴 그려 설명을 가지고 신뢰할 수 없습니다 : 그것은 멀티 프레임 DOM 환경에서 스크립트에 관해서

문제점이 발생한다. 간단히 말해서, 하나의 iframe 내에서 생성 된 Array 객체는 [[Prototype]]의 다른 iframe 내에서 만들어진 배열과 공유되지 않습니다. 이들의 생성자는 서로 다른 객체이므로 인스턴스 및 생성자 검사 모두 실패합니다.

멋진 기사 @http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/ 주제에 대한 Zuriy.

var iframe = document.createElement('iframe'); 
document.body.appendChild(iframe); 
xArray = window.frames[window.frames.length-1].Array; 
var arr = new xArray(1,2,3); // [1,2,3] 

// Boom! 
arr instanceof Array; // false 

// Boom! 
arr.constructor === Array; // false 
[jQuery의 인터넷 익스플로러 및 isFunction]의
+0

/instanceOf가 신뢰할 수없는 이유는 무엇입니까? – Matt

+0

왜 "instanceOf"가 좋지 않은지 알 수 있지만 "obj.constructor"는 어떻게 사용합니까? 우리가 모범을 보일 수 있습니까? –

+0

@ 미디어 감사합니다! 나는 몰랐다. – Matt

1

그들은 toString 메소드를 테스트하지 않고 객체의 프로토 타입의 toString 메소드를 obj에 호출하여 문자열로 변환합니다. 함수는 '[object Function]'으로 문자열에 캐스트합니다.

instanceof 신뢰할 수없고 어느 쪽도 생성자 방식이 아닙니다. 생성자 속성에 액세스하려고 시도하기 전에 obj이 null인지 아닌지 확인하는 확인이 필요합니다. 또한 toString 메서드보다 느린 것으로 추측합니다.

+0

I가 볼 수있는 문서 찍은

예 "instanceof"가 신뢰할 수없는 이유는 무엇입니까 (예제 function Array() {}),하지만 "constructor"는 어디에서 실패할까요? –

+1

@Eric "instanceof"가 문제가되는 것과 정확히 같은 이유입니다. "동일한"함수에 ​​의해 생성 된 경우에도 "생성자"참조는 서로 다른 두 프레임의 객체에 대해 다를 수 있습니다. 생성자 함수 (각각의 개별 창에서)는 구별됩니다. – Pointy

관련 문제