2011-07-01 10 views
4
내가 JS 프로토 타입 속성을 이해하려고 노력 AM

자바 스크립트 : 마지막 줄이 정의되지 여기프로토 타입

function Container(param) { 
    this.member = param; 
} 

var newc = new Container('abc'); 


Container.prototype.stamp = function (string) { 
    return this.member + string; 
} 

document.write(newc.stamp('def')); 

function Box() { 
    this.color = "red"; 
    this.member = "why"; 
} 

Container.prototype = new Box(); 
Box.prototype.test = "whatever"; 
var b = new Box(); 

document.write(newc.test); 

내 샘플 코드 - 왜 newC와 컨테이너의 프로토 타입은 상자와 상자의 프로토 타입 속성 테스트를했다하더라도이다 상자 doesnt 일에있는 시험을 말하는가? 어떤 사람이 위의 문맥에서 '프로토 타입'이 어떻게 작동하는지 설명해주십시오.

감사합니다 ...

+1

As the Scrum Meister는 인스턴스 생성 후'Container'의'prototype'을 설정했다고 말했습니다. 인스턴스는 여전히 이전 프로토 타입을 가리 킵니다. –

+0

질문에 대한 답변에만 댓글을 달 수 있으며 답변을 "편집"할 필요가 없습니다. –

+1

@FelixKling 만약 당신이 등급 1이라면 논평 할 수 없다고 생각합니다. : – Neil

답변

2

당신은 newc 예 후 Box()-Container 프로토 타입을 설정하는 이미 만들었습니다.

function Container(param) { 
    this.member = param; 
} 

function Box() { 
    this.color = "red"; 
    this.member = "why"; 
} 

Container.prototype = new Box(); 
Box.prototype.test = "whatever"; 
Container.prototype.stamp = function (string) { 
    return this.member + string; 
} 

//Here the containers prototype setup is complete. 
var newc = new Container('abc'); 

document.write(newc.stamp('def')); 

document.write(newc.test); 
+1

'Box.prototype.test = "무엇이든;을 설정하기 전에 인스턴스를 정의하면 예제가 더 나을 것이라고 생각합니다. 속성. 이렇게하면 "문제가있는"행은'Container.prototype = new Box();'만이 명확 해집니다. –

0

는 객체가 프로토 타입에 도착하는 데 사용하는 생성자에 대한 참조를 포함하지 않는 다음과 같이

는 문을 다시 정렬. 그렇게했다면 코드는 예상대로 작동합니다.

대신 객체는 객체가 만들어 질 때 설정되는 프로토 타입에 대한 참조를 포함합니다. 언어 사양 섹션 4.2.1에서

: 생성자에 의해 생성

모든 객체는 생성자의 "프로토 타입"속성의 값 (객체의 프로토 타입이라고) 암시 적 참조가 있습니다. 게다가, 프로토 타입은 프로토 타입에 대한 null이 아닌 암시 적 참조를 가질 수 있습니다. 이를 프로토 타입 체인이라고합니다. 객체의 속성에 대한 참조가 만들어지면이 참조는 해당 이름의 속성을 포함하는 프로토 타입 체인의 첫 번째 객체에있는 해당 이름의 속성입니다. 다시 말해, 먼저 직접 언급 한 대상에 대해 이러한 속성을 검사합니다. 그 객체가 이름 첨부 프로퍼티를 포함하고있는 경우는 참조가 참조하는 프로퍼티입니다. 해당 객체가 명명 된 속성을 포함하지 않으면 해당 객체의 프로토 타입이 다음에 검사됩니다. 등등.

2

소리가 나는 것처럼 행동하는 이유는 코드를 "수정"하는 것이 아니라. 그래서 여기에 무슨 일이 일어나고 있는지.

위에서 보았 듯이 "컨테이너"의 프로토 타입을 변경하면 이미 인스턴스화 된 새 개체 및 개체의 속성이 실제로 변경됩니다. 따라서 :

function Container(param) { 
    this.member = param; 
} 

var newc = new Container('abc'); 

// setting a new property of the prototype, after newc instantiated. 
Container.prototype.stamp = function (string) { 
    return this.member + string; 
} 

// This already-instantiated object can access the stamp function 
document.write(newc.stamp('123')); // output: abc123 

새 메서드가 정의되기 전에 호출하지 않는 한 위와 같은 문제가 없습니다. 이제 다음 요점. 위 내용에 추가 :

// Our Box object 
function Box() { 
    this.color = "red"; 
    this.member = "why"; 
} 

Container.prototype = new Box(); 
var newd = new Container('fgh'); 
document.write(newd.stamp('456')); // output: ERROR 

오류! 그러나 그 말이 맞습니다. "컨테이너"프로토 타입을 완전히 지우고 "스탬프"기능이없는 "박스"의 프로토 타입으로 교체했습니다.

"컨테이너"에서 "상자"를 상속한다고 가정합니다. 그것은 명명 규칙에서 논리적 일 것입니다. 당신이 그렇게하고 싶다면, 이것으로 이전 섹션을 대체 :

// Our Box object 
function Box() { 
    this.color = "red"; 
    this.member = "why"; 
} 

// This inherits from Container. Note that we can 
// do this before or after we declare "Box" 
Box.prototype = new Container(); 

Box.prototype.test = "Whatever"; 
var b = new Box("jkl"); // note: "jkl" is ignored because "Box" sets "member" to "why" 

document.write(b.test); // output: Whatever 
document.write("<br>"); 
document.write(b.stamp("345")); // output: why345 

그래서 지금 우리가 자신의 방법과 매개 변수를 호출하고, 또한 부모 "컨테이너"에서 호출 할 수있는 "상자"가 있습니다.

큰 그림은 객체가 메소드 나 무언가를 위해 자신의 프로토 타입을 보게 될 것이고, 발견하지 못하면 객체가 상속받은 객체의 원형을 볼 것입니다. 다른 중요한 점은 프로토 타입에 무언가를 설정하면 해당 객체의 모든 현재 및 현재 인스턴스에서 즉시 사용할 수 있다는 것입니다.

+0

마지막 단락에서 나를 잃어 버렸습니다 ... 상자 예제에서 상자의 프로토 타입은 이제 컨테이너입니다. 귀하의 성명서에서 Box가 프로토 타입을 가지고있는 것으로 보일 것입니다. 체크 박스가없는 경우 컨테이너의 프로토 타입을 사용합니다. –

+0

@justnS, Box의 초기 프로토 타입은 인스턴스화 된 컨테이너 객체로 설정됩니다. 그러면 Box가 Container를 상속받습니다. 그런 다음, Box 프로토 타입에 직접 추가 매개 변수를 설정합니다. 그러면 새 매개 변수가 작성되거나 Container에서 상속 된 매개 변수를 대체합니다. 진흙으로 맑습니까? – TheGerm