function A(x) { this.x = x; } alert(A.prototype); alert(A.prototype.constructor);
팝업 결과에 따르면 프로토타입 객체는 함수의 생성자에 의해 생성됩니다. 프로토타입 객체가 소유한 속성은 모든 객체에서 공유될 수 있습니다. 처음에는 프로토타입 객체가 Object 객체를 가리키고 정의합니다. 생성자 속성. 속성은 프로토타입 객체를 정의하는 생성자 자체를 가리킵니다. 다음 코드를 다시 살펴보세요.
코드
function A(x) { A.prototype.x = x; } var obj = new A(10); alert(obj.x); alert(obj.constructor);
프로토타입 객체의 모든 속성은 생성자가 생성한 객체에 의해 공유될 수 있기 때문에 생성된 객체는 여기서 생성자 속성에 접근할 수 있습니다. 동시에 obj는 프로토타입 객체(prototype)가 생성한 인스턴스에 해당합니다. 그런 다음 생성자 속성을 재정의하면 결과는 어떻게 될까요?
코드
function A(x) { A.prototype.x = x; } var objA = new A(10); objA.constructor = function(x){ alert("重写obj的constructor属性");this.x = 20 }; objA.constructor(); alert(objA.x); var objB = new A(10); alert(objB.x);
결과에 따르면 가장 먼저 나타나는 것은 "Rewrite the constructor attribute of obj"이고 그 다음에는 20개, 생성자를 작성하고 다시 작성한 후에는 10개가 나타나는 것을 알 수 있습니다. objA 객체의 objB는 변경되지 않았습니다. 따라서 객체에 얼마나 많은 속성을 추가하거나 수정하더라도 프로토타입 객체의 속성의 원래 모양에는 영향을 미치지 않습니다. 실제로 이유를 이해하기 쉽습니다. Node.js가 이렇게 하는 이유는 한 개체의 동작이 다른 개체에 영향을 미칠 수 없기 때문입니다. 그렇지 않으면 혼란이 발생할 수 있습니다.
여기에서 위 코드의 규칙을 요약할 수 있습니다.
1. 객체를 호출할 때 먼저 객체 자체의 자체 정의된 속성을 확인하고 존재하는 경우 호출합니다.
2. 자체 속성이 존재하지 않는 경우 해당 생성자가 정의한 프로토타입 객체의 참조가 호출됩니다.
그러면 이 규칙에 따라 JavaScript의 프로토타입 체인이 형성되고, 이 규칙에 따라 상속 관계를 정의할 수 있습니다.
function A(x) { A.prototype.x = x; } function B(x,y) { B.prototype.y = y; A.call(this,x); }
이 코드는 두 가지 함수를 보여줍니다. A.call(this.x)은 실행을 위해 B 개체 this를 전달하는 것을 의미합니다. 그런 다음 A 함수의 모든 특성을 포함하려면 B 함수로 생성된 개체도 필요하므로 이 문장을 추가해야 합니다.
function A(x) { A.prototype.x = x; A.prototype.ShowA = function(){ alert("A的Show方法!"); }; } function B(x,y) { B.prototype.y = y; A.call(this,x); B.prototype.ShowB = function(){ alert("B的Show方法!"); }; } B.prototype = new A(); B.prototype.constructor = B; var obj = new B(10,5); alert(obj.x); alert(obj.y); obj.ShowA(); obj.ShowB();
질문이나 오류가 있으면 자유롭게 수정하고 토론해 주세요.