하나. 두 개의 프로토 타입
많은 사람들은 JavaScript가 프로토 타입 상속임을 알고 있습니다. 각 생성자에는 프로토 타입 멤버가 있으며,이를 통해 JavaScript 상속은 아름답습니다.
실제로이 속성만으로는 JavaScript의 상속을 완료 할 수 없습니다.
코드에서 사용하는 프로토 타입에 대해서는 많이 말하지 않을 것입니다. 정보를 확인할 수 있습니다.
다른 보이지 않는 프로토 타입 멤버.
각 인스턴스에는 프로토 타입을 가리키는 프로토 타입 속성이 있습니다. 이 속성에 액세스 할 수 없으며 물론 자바 스크립트 상속을 유지하기위한 기초이기 때문에 수정할 수 없습니다.
코드 사본은 다음과 같습니다.
// 생성자 명령문
기능 guoyansi () {}
기능 guoyansiex () {}
// 프로토 타입 상속
guoyansiex.prototype = new Guoyansi ();
// 객체를 만듭니다
var g1 = 새로운 guoyansiex ();
var g2 = 새로운 guoyansiex ();
위 코드의 객체는 다음 그림으로 설명 할 수 있습니다.
2. 프로토 타입 유지 보수
생성자 속성이 항상 생성자를 가리키는 생성자에 의해 생성 된 인스턴스. 우리는 그 진술이 당분간 정확하다고 생각할 것입니다.
코드 사본은 다음과 같습니다.
기능 guoyansi () {}
var obj1 = 새로운 guoyansi ();
console.log (obj1.constructor === guoyansi); // true
실제로 생성자 자체에는 생성자 속성이 없으므로이 속성은 어디에서 나옵니까?
대답은 : 프로토 타입에서.
따라서 다음과 같은 결론이 도출됩니다
코드 사본은 다음과 같습니다. obj1.constructor === guoyansi.prototype.constructor === guoyansi
생성자를 통해 생성자를 찾을 수 있으므로 위의 다이어그램을 더욱 향상시킬 수 있습니다.
코드 사본은 다음과 같습니다.
기능 guoyansiex () {}
guoyansiex.prototype = new Guoyansi ();
console.log (guoyansiex.constructor === guoyansiex) // false
위의 그림에 따르면 위의 결과는 사실이어야하지만 왜 거짓입니까?
이제 분석을 수행하십시오.
Guoyansiex의 프로토 타입은 Guoyansi의 인스턴스에 의해 다시 작성되었으므로 Guoyansiex의 프로토 타입의 생성자는 자연스럽게 Guoyansi의 인스턴스입니다.
Guoyansi 인스턴스의 생성자는 Guoyansi.prototype에서 나옵니다. 그러나 Guoyansi.prototype은 다시 작성되지 않았습니다.
따라서 Guoyansi의 생성자는 Guoyansi (생성자)를 가리 킵니다.
위의 분석을 바탕으로 다음과 같은 결론을 도출합니다.
코드 사본은 다음과 같습니다. Guoyansiex.constructor === Guoyansi.constructor === Guoyansi;
개발 프로세스 중에 생성자의 지침 요구 사항이 매우 정확한 경우 다음 처리를 수행 할 수 있습니다.
코드 사본은 다음과 같습니다.
/** 방법 1 : **/
기능 guoyansi () {}
기능 guoyansiex () {}
guoyansiex.prototype = new Guoyansi ();
guoyansiex.prototype.constructor = guoyansiex; // 생성자 포인터를 재설정합니다.
코드 사본은 다음과 같습니다.
/**
방법 2
**/
기능 guoyansi () {}
함수 guoyansiex () {
this.constructor = arguments.callee;
}
guoyansiex.prototype = new Guoyansi ();
코드 사본은 다음과 같습니다.
/**
방법 3
**/
기능 guoyansi () {}
함수 guoyansiex () {
this.constructor = guoyansiex;
}
guoyansiex.prototype = new Guoyansi ();
3. 보이지 않는 프로토 타입의 사용은 무엇입니까?
우리는 가시적 프로토 타입 체인을 작동하여 상속을 완료 할 수 있으므로이 보이지 않는 프로토 타입 체인을보고 작동 할 수 없습니다. 그것의 사용은 무엇입니까?
객체 지향 상속에 특징이 있습니다 : 유사성. 서브 클래스는 학부모 클래스와 유사합니다. 따라서 서브 클래스에서는 DELETE를 사용하여 상위 클래스에서 상속 된 멤버를 삭제할 수 없습니다. 즉, 서브 클래스에는 부모 클래스의 특성이 있어야합니다.
이 기능을 유지하기 위해 JavaScript는 객체 내부에 보이지 않는 프로토 타입 속성을 생성하며 사용자가 액세스 할 수 없습니다. 이러한 방식으로 사용자는 어떤 목적 으로든 생성자를 수정할 수 있습니다.
부모 계급을 가진 아동 계급의 특성을 파괴하지는 않습니다.
간단히 말해서 : 내부 프로토 타입은 JavaScript의 프로토 타입 상속 메커니즘에 의해 요구되는 반면, 사용자는 외부 프로토 타입은 상속을 구현해야합니다.
Firefox 엔진 Spidermonkey에서 4. __proto__
여전히이 코드.
코드 사본은 다음과 같습니다.
기능 guoyansi () {}
guoyansi.prototype.age = 24;
기능 guoyansiex () {}
var obj1 = 새로운 guoyansi ();
guoyansiex.prototype = obj1;
guoyansiex.prototype.constructor = guoyansiex; // 생성자 포인터를 재설정합니다.
var obj2 = 새로운 guoyansiex ();
나는 이제 OBJ에서 시작하는 부모 클래스 guoyansi의 프로토 타입의 속성의 시대에 접근하고 싶다.
이것이 아이디어입니다.
1 단계 : OBJ2 ====> obj2.constructor.prototype
2 부 : obj2.constructor.prototype ===> guoyansiex.prototype;
파트 3 : guoyansiex.prototype ===> obj1;
파트 4 : OBJ1.Constructor ====> Guoyansi
5 부 : Guoyansi.prototype.age
다음과 같이 씁니다 : console.log (obj2.constructor.prototype.constructor.prototype.age) // 24;
최종 결과는 24입니다.
최종 결과는 24입니다. 정상적으로 실행할 수 있지만 많은 책에서는 생성자가 수정 된 후에 수준이 부모 클래스에서 프로토 타입을 찾을 수 없다고합니다. 무슨 일이 일어나고 있는지 모르겠습니다.
Firefox._proto_에서 더 간결한 속성이 충분합니다.
기본적으로 SpiderMonkey는 생성 된 객체에 _proto_라는 속성을 추가하여 생성자가 사용하는 프로토 타입을 가리 킵니다.
실제로, 그것은 위에서 언급 한 보이지 않는 프로토 타입 체인이지만, 이곳에서 위장한 공개 일뿐입니다.
이런 식으로 나이에 액세스 할 수 있습니다
console.log (obj2 .__ proto __.__ proto __. age); // 24
이것은 실제로 상위 클래스의 프로토 타입 속성에 성공적으로 액세스하지만이 속성은 Firefox에만 적용 가능하며 다른 브라우저에는 오류가 있습니다.
E5에서 객체는 Object.getPrototype ()로 확장되며 모든 상위 클래스 프로토 타입에 액세스 할 수 있습니다.
코드 사본은 다음과 같습니다.
기능 guoyansi () {}
guoyansi.prototype.age = 24;
기능 guoyansiex () {}
var obj1 = 새로운 guoyansi ();
guoyansiex.prototype = obj1;
guoyansiex.prototype.constructor = guoyansiex; // 생성자 포인터를 재설정합니다.
var obj2 = 새로운 guoyansiex ();
var proto = Object.getPrototypof (OBJ2);
while (proto) {
Console.log (proto.constructor);
proto = Object.getPrototypof (proto);
}
Console.log ( "개체의 프로토 타입"+프로토);
결과는 : Guoyansiex
단두 안시
물체
객체의 프로토 타입 널
나는 개인적으로 이것들이 객체 지향 JavaScript의 본질 중 하나로 간주되어야한다고 생각합니다. 직접 참조하여 귀하의 필요에 따라 자신의 프로젝트에서 사용하십시오.