2016-10-10 3 views
-1

아래의 코드를 사용하여 프로토 타입 상속 관계를 두 객체로 설정합니다.프로토 타입이 객체에서 다른 객체로 상속받습니다.

var a={}; 
var b={}; 

b.__proto__=a; 
a.dosomething=function(){ 
    alert ('ok'); 
}; 
b.dosomething();//ok 

하지만 그것은 단지 파이어 폭스로 인해 프로토 파이어 폭스에서만 사용할 수 있습니다 작동합니다. A, B가 어떤 생성자 함수를 사용하여 생성하는 경우, I가 상속 관계를 설정

b.constructor.prototype=a; 

를 사용할 수있는 다른 웹 브라우저에서

.

위의 경우 a, b의 생성자는 모두 Object입니다. Object의 프로토 타입을 변경할 수 없습니다.

proto을 제외하고 상속 관계를 설정할 수있는 방법이 있습니까?

귀하의 의견을 환영

+0

'__proto__'을 원하셨습니까? – Oriol

+0

예, __proto__입니다. – arachide

+0

위의 코드에서 b를 프로토 타입으로 설정하지 않았습니까? 아래의 코드에서 왜'b.prototype = a' 대신에'b.constructor.prototype = a'을하고 있습니까? 또한 올바른 개체는 js의 어머니 프로토 타입입니다. 문제를 더 잘 이해하는 것이 좋습니다. –

답변

1

당신은 Object.create를 사용할 수 있습니다. 프로토 타입이 전달 된 객체 인 객체를 만듭니다.

var a = {}; 
 
var b = Object.create(a); 
 

 
a.dosomething = function() { 
 
    alert ('ok'); 
 
}; 
 
b.dosomething(); // ok

또한 이미 존재하는 개체에 대한 Object.setPrototypeOf를 사용할 수 있습니다. 정말로, 당신이 그것을 피할 수 있다면 이 아니라이 아닙니다. 심각한 성능 문제가 발생합니다.

+0

은 새로운 b (새로운 객체)를 생성하기 위해서만 사용됩니다. a와 b가 존재한다면 상속 관계를 설정할 수 있습니까? – arachide

+0

@arachide 그래. 내 편집을 참조하십시오. –

+0

위대한! 고마워. – arachide

2

var a = {}; 
 
var b = {}; 
 

 
Object.setPrototypeOf(b, a); 
 

 
a.dosomething = function() { 
 
    alert ('ok'); 
 
}; 
 
b.dosomething(); // ok

은 기존 개체
의 프로토 타입을 변경하지 마십시오.

경고 :모든 브라우저와 자바 스크립트 엔진에 현대적인 자바 스크립트 엔진이 속성은 매우 느린 동작에 액세스 최적화 방법의 성격 에 의해, 객체의 [[Prototype]]입니다 변경. 상속을 변경의 성능에 효과는 미묘하고 멀리 떨어진하고 obj.__proto__ = ... 문에서 보낸 단순히 시간에 한정되지 않고 는 어떤에 액세스 할 수 있는지 어떤 코드를 연장 할 수있다 [[Prototype]]가 변경된 개체입니다. 성능에 신경 쓰는 경우 [[Prototype]] 개체를 설정하지 마십시오. 대신, Object.create()을 사용하여 을 원하는 으로 새 객체를 만듭니다.

표준 방식은 __proto__이 아니라 Object.setPrototypeOf입니다.

적절한 방법은

var a = {}; 
 
var b = Object.create(a); 
 
a.dosomething = function(){ 
 
    console.log('ok'); 
 
}; 
 
b.dosomething();

귀하의 b.constructor.prototype = a; 접근 방식은 쓸모가있다. b이 생성자 C의 인스턴스 인 경우 해당 코드는 변경 이후에 생성 된 인스턴스에만 적용되지만 b에는 적용되지 않습니다.

관련 문제