소리가 나는 것처럼 행동하는 이유는 코드를 "수정"하는 것이 아니라. 그래서 여기에 무슨 일이 일어나고 있는지.
위에서 보았 듯이 "컨테이너"의 프로토 타입을 변경하면 이미 인스턴스화 된 새 개체 및 개체의 속성이 실제로 변경됩니다. 따라서 :
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
그래서 지금 우리가 자신의 방법과 매개 변수를 호출하고, 또한 부모 "컨테이너"에서 호출 할 수있는 "상자"가 있습니다.
큰 그림은 객체가 메소드 나 무언가를 위해 자신의 프로토 타입을 보게 될 것이고, 발견하지 못하면 객체가 상속받은 객체의 원형을 볼 것입니다. 다른 중요한 점은 프로토 타입에 무언가를 설정하면 해당 객체의 모든 현재 및 현재 인스턴스에서 즉시 사용할 수 있다는 것입니다.
As the Scrum Meister는 인스턴스 생성 후'Container'의'prototype'을 설정했다고 말했습니다. 인스턴스는 여전히 이전 프로토 타입을 가리 킵니다. –
질문에 대한 답변에만 댓글을 달 수 있으며 답변을 "편집"할 필요가 없습니다. –
@FelixKling 만약 당신이 등급 1이라면 논평 할 수 없다고 생각합니다. : – Neil