2012-01-17 4 views
8

나는 현재 '자바 스크립트 좋은 부품을'읽고있다, 나는 다음 단락을 가로 질러왔다프로토 타입 상속을 사용하는 자바 스크립트 코드에서 객체 수명은 어떻게됩니까?

우리는 개체에서 속성 값을 검색하려고하면, 그리고 객체에 속성 이름, 다음 자바 스크립트 시도 부족한 경우 프로토 타입 개체에서 속성 값 을 검색합니다. 그리고 해당 객체가 속성이없는 인 경우 프로토 타입으로 이동하고 까지 프로세스는 결국 Object.prototype으로 끝을 맺습니다.

obj1에서 객체 obj2를 프로토 타입으로 만들면 obj2도 범위를 벗어날 때까지 obj1을 삭제할 수 없습니까?

+0

다른 자바 스크립트 엔진이 프로토 타입을 구현하는 방법을 실제로 모르지만, 객체에 대한 ** 참조 **와 같지 않습니다. 이것은 상속 메커니즘과 비슷하기 때문에 obj1의 인스턴스 **가 obj2가 존재하는 데 필요하다면 놀랄 것입니다. –

답변

5

오브젝트의 상속 (프로토 타입을 링크)을 구축했다면 브라우저가 해당 오브젝트에 대한 참조를 사용한다고 생각하지 않습니다.

EX1 :

var a = function(){}; 
a.prototype.toString = function(){return "I'm an A!";}; 
var b = new a(); 
a = undefined; 
var c = new a();// error => a is not a function any more! 
b.toString();// it works because the prototype is not destroyed, 
      // only our reference is destroyed 

EX2 :

var a = function(){}; 
a.prototype.toString = function(){return "I'm an A!";}; 
var b = function(){}; 
b.prototype = new a(); 
a = undefined; 
var c = new b(); 
console.log(c+'');// It still works, although our 
        // initial prototype `a` doesn't exist any more. 

UPDATE : 이 동작은 자바 스크립트 정확하게 물체를 파괴 할 수 있다는 사실과 관련이있을 수 있습니다 ; 당신은 그것에 대한 모든 참조만을 제거 할 수 있습니다. 그런 다음 브라우저는 참조되지 않은 객체를 처리하는 방법을 Garbage collector으로 결정합니다.

+1

흠,'a'는'b.prototype'처럼 그 객체에 대한 참조가 아니 었습니까? 우리는 여전히 참조가있는 것 같습니다. – kapa

+0

'b.prototype'은'a'의 ** 인스턴스 **입니다. (new 키워드를 느낀다.) –

+0

** name **'b.prototype'은 확실히 ** reference **이다.'new a()'는 객체에 대한 무명의 참조를 리턴한다. 'b.prototype'과 같은 이름 붙인 참조를 사용하거나, 한 번 사용 된 후 사용할 수 없게되어 액세스 할 수 없게됩니다 (문자 그대로 범위를 벗어납니다). – zuba

관련 문제