다시 쓰 는 isPlainObject 방법

3344 단어 object
jq 1.4 에 정적 방법 $. isPlainObject 가 추가 되 었 습 니 다. http://api.jquery.com/jquery.isPlainObject/ 참조.
글자 의 양 을 통 해 정 의 된 대상 과 new Object 의 대상 에 대해 true 를 되 돌려 줍 니 다. new Object 는 매개 변 수 를 false 로 되 돌려 줍 니 다. 예 를 들 어
var p1 = new Object;
p1.name = 'tom';
var o1 = new Object('aa');
console.log($.isPlainObject({name:'Jack'})); //-> true
console.log($.isPlainObject(p1));	     //-> true
console.log($.isPlainObject('aa'));	     //-> false
console.log($.isPlainObject(o1));	     //-> false 

$. isPlainObject (o1) 가 돌아 오 는 것 도 false 입 니 다.글자 의 양 을 통 해 정 의 된 대상 은 그 구조 기 가 Object 라 는 것 을 쉽게 증명 할 수 있다.
var obj = {};
console.log(obj.constructor === Object); //-> true

jq 1.4 새로 추 가 된 이 방법 은 쓸모 가 크 지 않 고 Object 구조 기 에서 생 성 된 대상 (매개 변수 전달 시 예외) 만 판단 할 수 있 습 니 다. 심지어 이것 은 jq 내부 에서 만 사용 하 는 것 이 라 고 생각 했 으 나 하필 공개 되 어 $에 걸 렸 습 니 다.
클래스 (구조 기) 를 사용자 정의 할 때 $. isPlainObject 로 new 사용자 정의 클래스 의 대상 을 판단 할 때 false 로 돌아 갑 니 다.
//    (   ),      p
function Person(){this.name='jack'}
var p = new Person();

$.isPlainObject(p); //-> false

따라서 글자 의 양 적 정의 와 사용자 정의 클래스 (구조 기) 를 통 해 만 든 대상 에 대해 트 루 로 돌아 가 는 방법 을 쓰 고 싶 습 니 다.
function myIsPlainObject( obj ){
	return Object.prototype.toString.call(obj)==='[object Object]';
}

테스트 해 봐.
function Person(name){
	this.name=name;
}
var p = new Person('jack');
var o = {name:'tom'};

console.log(myIsPlainObject(p)); //-> true
console.log(myIsPlainObject(o)); //-> true

모두 트 루 로 돌아 가 모든 것 이 순 조로 운 것 같 습 니 다.
하필 IE 에서 window / document / document. body / HTMLElement / HTMLCollection / Nodelist / 도 true 로 돌 아 왔 습 니 다.즉, IE 에서 Object. prototype. toString. call 이상 의 대상 이 되 돌아 오 는 문자열 도 '[object Object]' 입 니 다. IE 가 왜 이렇게 이 루어 졌 는 지 모 르 겠 습 니 다. Firefox / chrome / safari / Opera 는 그렇지 않 습 니 다.수정 하 다
function myIsPlainObject( obj ){
	return 'isPrototypeOf' in obj && Object.prototype.toString.call(obj)==='[object Object]';
}

obj 가 isPrototype Of 속성 을 가지 고 있 는 지 판단 합 니 다. isPrototype Of 는 Object. prototype 에 걸 려 있 습 니 다.글자 의 양 이나 사용자 정의 클래스 (구조 기) 를 통 해 만 든 대상 은 이 속성 방법 을 계승 합 니 다. 약속 이 있 는 경우 이 방법 을 사용 할 수 있 습 니 다.
console.log(myIsPlainObject(window));   //-> false
console.log(myIsPlainObject(document)); //-> false

그러나 약속 을 지 키 지 않 은 상태 에서 도 실패 합 니 다. 예 를 들 어 window 에 isPrototype Of 속성 을 인위적으로 추가 하 는 것 과 같 습 니 다.
window.isPrototypeOf = '';
console.log(myIsPlainObject(window)); //-> true

관련:
new Object 에 대한 자세 한 정보 
isPlainObject 는 글자 의 양 대상 여 부 를 판단 합 니 다. 

좋은 웹페이지 즐겨찾기