2011-10-05 8 views
51

모든 기사에서 자바 스크립트는 프로토 타입 기반 언어이므로 모든 객체가 프로토 타입 (또는 더 정확하게 프로토 타입 체인)을 가지고 있음을 의미합니다.자바 스크립트에서 객체 프로토 타입에 액세스하는 방법?

지금까지, 나는 다음과 같은 코드를 시도했다 :

가 어떻게 object1의 프로토 타입 객체에 액세스 할 수 있습니다

var F = function(); 
F.prototype.member1 = 1; 
var object1 = new F(); 
console.log(object1.member1); // prints 1 
? 브라우저 중립적 인 방법이 있습니까 (즉, __proto__ 속성에 의존하지 말라는 뜻입니까? this 링크로 보았습니다. 2010 년 이후로 새로운 개발이있을 수 있습니다). 내가 할 수 없다면, 후드의 근거를 공유 할 수 있습니까?

+1

object1.constructor.prototype –

답변

90
var f=function(); 
var instance=new f(); 

당신이 instance클래스 기능의 이름, 당신은 단순히 프로토 타입에 액세스 할 수 있습니다 알고있는 경우 : 모르는 경우

var prototype=f.prototype; 
prototype.someMember=someValue; 

:

1)

var prototype=Object.getPrototypeOf(instance); 
prototype.someMember=someValue; 

2) 또는

var prototype=instance.__proto__; 
prototype.someMember=someValue; 

3) 또는) 프로토 타입을 반환하는 다음 코드에 배치 (항상 Object.getPrototypeOf(instance)를 사용할 수있는 호환성을 위해

var prototype=instance.constructor.prototype; // works only if constructor is properly assigned and not modified 
prototype.someMember=someValue; 

:

if(!Object.getPrototypeOf) { 
    if(({}).__proto__===Object.prototype&&([]).__proto__===Array.prototype) { 
    Object.getPrototypeOf=function getPrototypeOf(object) { 
     return object.__proto__; 
    }; 
    } else { 
    Object.getPrototypeOf=function getPrototypeOf(object) { 
     // May break if the constructor has been changed or removed 
     return object.constructor?object.constructor.prototype:void 0; 
    }; 
    } 
} 

UPDATE :

ECMA-262 6th Edition (2015 년 6 월) __proto__ 속성은 웹 브라우저의 추가 기능으로 표준화되었습니다. 최신 브라우저의 모든 최신 버전에서 지원됩니다. 자세히보기 __proto__에 대한 :

MDN : Object.prototype.__proto__

EDMA-262 6 판 (6 월 2015 년) : B.2.2.1 Object.prototype.__proto__

+0

하나의 코멘트와 함께 :'__proto__'는 모든 브라우저에서 작동하지 않습니다. – BreakPhreak

+14

'__proto__'뿐만 아니라 위의 세 가지 방법 모두가 모든 브라우저에서 작동하지 않습니다. 그러나 호환성 코드는 이러한 모든 방법을 기반으로합니다.또한 5 개의 주요 브라우저 (IE, FF, Chrome, Safari, Opera)의 경우 브라우저의 모든 버전에서 Object.getPrototypeOf()가 지원되며 호환성 코드는 IE8 이상에서만 필요합니다. –

5
var F = function(){}; 
var object1 = new F(); 
alert(object1.constructor === F); 
alert(object1.constructor.prototype === F.prototype); 
+1

주입니다. 예를 들어 a = Function.prototype; a.constructor.prototype은 a와 같습니다. 그러나 분명히 a의 프로토 타입은 다릅니다. 프로토 타입을 확인하는 가장 좋은 방법 인 .__ proto__을 확인하여 a의 프로토 타입이 Object.prototype인지 확인할 수 있습니다. –

2
var F = function(); 
F.prototype.member1 = 1; 
F.prototype.getClass = F; 

var object1 = new F(); 
object1.member1 = 2; 

console.log(object1.getClass.prototype.member1); // prints 1 
console.log(object1.member1); // prints 2 
2

Object.getPrototypeOf(passedObject); 

이 작동 것처럼 보이고, 최신 브라우저와 호환됩니다. 여기

가끔 작동하지 않는다는 compatibility tables on MDN

관련 문제