2009-07-25 4 views
2

이러한 조건에서 new Objectnew fn의 차이를 어떻게 확인할 수 있습니까?새 개체와 새 fn의 차이 확인

  • var fn = function(){};
  • fn.prototype = {};
  • 가 IE 나 오페라에없는 것처럼 당신은 __proto__ 또는 Object.getPrototypeOf 기존에 의존하지 않을 수 있습니다.
  • 이 솔루션은 과 같이 정적으로을 사용할 수 없습니다.
  • Object.getPrototypeOf을 구현하는 것이 좋습니다.

필요하지 않음 : 솔루션이 다른 프레임에서 객체와 함께 작동 및 기능 직렬화를 사용하지 않는 경우 그것은 좋은 것입니다. 지금까지 내가 당신의 문제가 ES3으로 해결하는 것은 불가능 알고

var fn = function(){}; 
fn.prototype = {}; 

var x = new fn, 
y = new Object; 

fn = null; // prohibit static reference to fn 

// define your detection function here 
function isNewObject(obj) { 

}; 

alert(isNewObject(x) !== isNewObject(y) ? "pass" : "fail"); 
+0

당신은 foo가 SomeClass의 인스턴스인지, 아니면 동일한 속성을 가진 개체인지 알고 싶습니까? –

+2

나는 이것이 가능하다고 생각하지 않는다. –

+0

@gs __proto__ 또는 Object.getPrototypeOf를 사용하여 가능합니다.하지만 브라우저 간 호환이 아닙니다. –

답변

3

나는 당신이 단지 표준 지원 ES3에서이 작업을 수행 할 수없는 확신, 여기에 이유 : xy 생성시

봐. x가 인스턴스화 될 때

var fn = function(){}; 
fn.prototype = {}; 

var x = new fn, 
    y = new Object; 

는 내부 [프로토 타입] fn.prototype 의해 참조되는 오브젝트 (만약 fn.prototype 할당 단지 Object 개체)로 설정하고있다. 객체의 생성자 - fn -이 새로 생성 된 객체의 컨텍스트에서 호출되고 있지만 어떤 방식 으로든 ab 객체를 변형시키지 않으므로 그 단계는 무의미하다고 생각할 수 있습니다.

y이 인스턴스화되면 내부 [[Prototype]]이 Object.prototype으로 설정되며 이는 Object 개체이기도합니다. 그 생성자 (Object)는이 새로 생성 된 객체의 컨텍스트에서 호출되지만 아무 것도 발생하지 않습니다.

그래서 지금 당신은 단지에서 다른 2 Object 객체로 끝날 내부 [[프로토 타입]]이 '의 참조 다른 개체 - x의 당신이 fn.prototype에 할당 y의 참조 Object.prototype 어떤 일 참조. 내부의 [[Class]] 속성도 동일합니다 (예 :"Object"와 동일)

ES3에서는 [[Prototype]]에 직접 액세스 할 수 없습니다. instanceof을 사용하여 그것에 대해 무언가를 추측 할 수 있지만 intanceof 기반의 추측은 그림에서 벗어났습니다. fn이 예제에서 제외되었습니다.

이제 Object 생성자를 인스턴스화 된 객체를 어떻게 변형시킬 수있는 방법으로 생성자를 추가 할 수 있습니다. 그런 다음 개체를 검사하고이 기능을 탐지 할 수 있습니다. 다음

Object = function() { 
    return ({ __: void 0 }); 
} 

과 : 예를 들어

function isNewObject(object) { 
    return '__' in object; 
} 

하지만 객체가 new Object으로 생성되지 객체 리터럴, 말을 통해 될 때이 뜻은 물론에만 작동 - { }. 또한 다소 눈에 띄지 않습니다.

아마도 다른 방법이 있지만 지금은 볼 수 없습니다.

HTH

+0

당신의 솔루션은 누군가가 명시 적으로 '__'을 정의하지 못했을 때만 작동 할 것이지만, 가능한 유일한 방법 인 것 같다. (프로퍼티를 반복하고 사용함으로써 bruteforcing하는 것 이외에! obj.hasOwnProperty (..) 및! Object.prototype.hasOwnProperty (..) –

+0

물론 "__"을보다 고유 한 토큰으로 변경할 수는 있지만 문제는 여전히 지속됩니다. 모든 스크립트는이 고유 토큰을 추가/삭제하여 Object 객체를 스푸핑 할 수 있습니다. – kangax

3

: 프로토 타입 객체에 있기 때문에 그것을 해결하는 데 사용할 수 없습니다 instanceofisPrototypeOf() 여기

함께 시작하는 몇 가지 예를 들어 기본 코드입니다 fn은 액세스 할 수 없으며 ES5 만 Object.getPrototypeOf()을 통해 내부 [Prototype] 속성에 액세스 할 수 있습니다. 당신이 FooObject 인스턴스의 프로토 타입 체인이 동일하기 때문에, fn.prototypeObject.prototype, 예를 들어

var x = (function() { 
    function Foo() {} 
    Foo.prototype = Object.prototype; 
    return new Foo; 
})(); 

를 할당 구별 할 수있는 방법이 안 경우

, BTW 해결하기 위해 더 열심히 문제가 될 것이다 그들.

관련 문제