내가 올바르게 이해하면 Javascript의 모든 객체는 Object 프로토 타입에서 상속됩니다.
머리카락을 쪼개는 것처럼 보일 수 있지만 javascript (ECMAScript 구현의 일반 용어)와 ECMAScript (JavaScript 구현에 사용되는 언어 ) 간에 차이가 있습니다. 자바 스크립트가 아닌 상속 체계를 정의하는 것은 ECMAScript이므로 네이티브 ECMAScript 개체 만 해당 상속 체계를 구현하면됩니다.
실행중인 자바 스크립트 프로그램은 최소한 내장 된 ECMAScript 객체 (Object, Function, Number 등)와 일부 네이티브 객체 (예 : 함수)로 구성됩니다. 또한 일부 호스트 개체 (예 : 브라우저의 DOM 개체 또는 다른 호스트 환경의 다른 개체)가있을 수 있습니다.
내장 및 네이티브 객체는 ECMA-262에 정의 된 상속 체계를 구현해야하지만 호스트 객체는 그렇지 않습니다. 따라서 자바 스크립트 환경의 모든 개체가 Object.prototype 에서 상속 되어야 하는 것은 아닙니다 . 예를 들어, ActiveX 개체로 구현 된 IE의 호스트 개체는 네이티브 개체로 취급되면 오류를 발생시킵니다 (따라서 try..catch가 MS XMLHttpRequest 개체를 초기화하는 데 사용되는 이유). 일부 DOM 개체 (예 : 쿼크 모드의 IE의 NodeLists)는 Array 메서드에 전달되면 오류가 발생하고 IE 8 이하의 DOM 개체에는 ECMAScript와 같은 상속 체계가없는 등의 문제가 발생합니다.
따라서 자바 스크립트 환경의 모든 객체가 Object.prototype에서 상속한다고 가정해서는 안됩니다.
즉, Javascript의 모든 객체는 프로토 타입 체인을 통해 hasOwnProperty 함수에 액세스 할 수 있습니다.
최소한 쿼크 모드 (및 IE 8 이하에서는 항상)의 IE의 특정 호스트 개체에는 해당되지 않습니다.
위의 내용을 감안할 때 객체에 자체 hasOwnProperty 메서드 가있는 이유와 그것이 좋은 생각인지 아닌지 먼저 테스트하지 않고 대신 다른 hasOwnProperty 메서드 를 호출 하는 것이 좋습니다.
편집하다
사용하는 이유 Object.prototype.hasOwnProperty.call
는 일부 브라우저에서 호스트 개체에 hasOwnProperty 메서드 가없고 call 을 사용하고 기본 제공 메서드가 대안이라는 것입니다. 그러나 일반적으로 그렇게하는 것은 위에서 언급 한 이유 때문에 좋은 생각이 아닌 것 같습니다.
호스트 개체와 관련하여 in 연산자를 사용하여 일반적으로 속성을 테스트 할 수 있습니다.
var o = document.getElementsByTagName('foo');
// false in most browsers, throws an error in IE 6, and probably 7 and 8
o.hasOwnProperty('bar');
// false in all browsers
('bar' in o);
// false (in all browsers? Do some throw errors?)
Object.prototype.hasOwnProperty.call(o, 'bar');
대안 (IE6 및 기타에서 테스트 됨) :
function ownProp(o, prop) {
if ('hasOwnProperty' in o) {
return o.hasOwnProperty(prop);
} else {
return Object.prototype.hasOwnProperty.call(o, prop);
}
}
이렇게 하면 객체에 상속 또는 기타 항목이없는 내장 hasOwnProperty 만 구체적으로 호출 됩니다.
그러나 객체에 hasOwnProperty
메서드 가없는 경우 객체 에 상속 체계가없고 모든 속성이 객체에있을 가능성이 높기 때문에 in 연산자 를 사용하는 것이 적절할 것입니다 (단지 가정 일뿐입니다). in 연산자는 속성에 대한 DOM 개체 지원을 테스트하는 일반적인 (그리고 성공적으로 보이는) 방법입니다.