자바 스크립트에는 많은 혼란스러운 관계가 있습니다. 스코프 체인은 단방향 체인 관계로 매우 간단하고 명확합니다. 이 메커니즘의 부름 관계는 약간 복잡합니다. 프로토 타입의 경우 프로토 타입, 프로토 및 생성자 간의 삼각형 관계입니다. 이 기사는 먼저 그림을 사용하여 의미를 명확히 한 다음 프로토 타입의 삼각형 관계를 자세히 설명합니다.
삽화
개념
위 그림의 복잡한 관계는 실제로 두 줄의 코드에서 나옵니다.
함수 foo () {}; var f1 = new foo;【건설자】
새로 생성 된 개체를 초기화하는 데 사용되는 함수는 생성자입니다. 예에서 foo () 함수는 생성자입니다
【인스턴스 객체】
생성자의 새 작동에 의해 생성 된 객체는 인스턴스 객체입니다. 하나의 생성자를 사용하여 여러 인스턴스 객체를 구성 할 수 있습니다.
함수 foo () {}; var f1 = new foo; var f2 = new foo; console.log (f1 === f2); // false【프로토 타입 객체 및 프로토 타입】
생성자는 인스턴스 개체의 프로토 타입 객체를 가리키는 프로토 타입 속성을 가지고 있습니다. 동일한 생성자에 의해 인스턴스화 된 다중 객체는 동일한 프로토 타입 객체를 갖습니다. 정기적으로 프로토 타입 객체를 사용하여 상속을 달성하십시오
함수 foo () {{}; foo.prototype.a = 1; var f1 = new foo; var f2 = new foo; console.log (foo.prototyp.a); // 1console.log (f1.a); // 1console.log (f2.a); // 1console.log (f2.a); // 1【건설자】
프로토 타입 객체에는 프로토 타입 객체에 해당하는 생성자 함수를 가리키는 생성자 속성이 있습니다.
함수 foo () {}; console.log (foo.prototype.constructor === foo); // true인스턴스 객체는 프로토 타입 객체의 속성을 상속 할 수 있으므로 인스턴스 객체에는 생성자 속성이 있으며 프로토 타입 객체에 해당하는 생성자 함수를 가리 킵니다.
함수 foo () {}; var f1 = new foo; console.log (f1.constructor === foo); // true【프로토】
인스턴스 객체에는 인스턴스 개체에 해당하는 프로토 타입 객체를 가리키는 프로토 속성이 있습니다.
함수 foo () {{}; var f1 = new foo; console.log (f1 .__ proto__ === foo.prototype); // true설명
이 개념이 소개되었으며 이제 우리는 관계를 자세히 설명 할 것입니다.
함수 foo () {}; var f1 = new foo;【1 부 : foo】
인스턴스 객체 F1은 생성자 foo ()의 새로운 작동에 의해 생성됩니다. 생성자 foo ()의 프로토 타입 객체는 foo.prototype입니다. 인스턴스 객체 F1은 __proto__ 속성을 통해 프로토 타입 객체 foo.prototype을 가리 킵니다.
함수 foo () {{}; var f1 = new foo; console.log (f1 .__ proto === foo.prototype); // true인스턴스 객체 F1 자체에는 생성자 속성이 없지만 프로토 타입 객체 foo.prototyp의 생성자 속성을 상속받을 수 있습니다.
FUNTUCT FOO () {{}; var f1 = new foo; console.log (foo.prototyp.constructor === foo); // trueconsole.log (f1.constructor === foo); // trueconsole.log (f1.hasownproperty ( 'constructor'); // 거짓.다음 그림은 인스턴스 객체 F1의 콘솔 효과를 보여줍니다.
【파트 2 : 객체 2
foo.prototype은 F1의 프로토 타입 객체이며 인스턴스 객체이기도합니다. 실제로, 모든 객체는 객체 () 생성자의 새로운 작동을 통해 인스턴스화 된 객체로 간주 될 수 있습니다. 따라서 foo.prototype는 인스턴스 객체이고 생성자는 Object ()이고 프로토 타입 객체는 Object.prototype입니다. 따라서, 생성자 객체 ()의 프로토 타입 속성은 프로토 타입 객체 객체를 가리킨다. 인스턴스 객체의 프로토 속성 foo.prototype도 프로토 타입 객체 객체를 가리 킵니다.
함수 foo () {}; var f1 = new foo; console.log (foo.prototype .__ proto__ === 객체 .prototype); // true인스턴스 객체 foo.prototype 자체에는 생성자 속성이 있으므로 프로토 타입 객체에서 상속 된 생성자 속성을 무시합니다.
함수 foo () {{}; var f1 = new foo; console.log (foo.prototype.constructor === foo); // trueconsole.log (object.prototype.constructor === object); // trueconsole.log (foo.prototype.hasownproperty ( 'constructor')); // trueconsole.log (foo.prototype.hasownproperty ( 'constructor')); // true다음 그림은 인스턴스 객체 foo.prototype의 콘솔 효과를 보여줍니다.
Object.prototype이 인스턴스 객체 인 경우 프로토 타입 객체는 무엇입니까? 결과는 널입니다. 나는 이것이 널 타입의 결과일지도 모른다고 생각합니다.
Console.log (Object.prototype .__ proto__ === null); // true
【파트 3 : 기능 3
앞에서 언급했듯이 함수는 객체이지만 특수 기능을 가진 객체입니다. 모든 함수는 함수 () 생성자의 새로운 작동을 통해 인스턴스화의 결과로 간주 될 수 있습니다.
함수 FOO가 인스턴스 객체로 간주되면 해당 생성자는 function ()이고 프로토 타입 객체는 function.prototype; 마찬가지로, 함수 객체의 생성자는 또한 function ()이며 프로토 타입 객체는 function.prototype입니다.
funture foo () {{}; var f1 = new foo; console.log (foo .__ proto__ === function.prototype); // trueconsole.log (Object .__ proto__ === function.prototype); // true프로토 타입 객체 함수의 생성자 속성. 프로로 타입은 생성자 함수 ()를 가리킨다. 인스턴스 객체 객체와 foo에는 생성자 속성이 없으며 프로토 타입 객체 함수의 생성자 속성을 상속해야합니다.
함수 foo () {{}; var f1 = new foo; console.log (function.prototype.constructor === function); // trueconsole.log (foo.constructor === function); // trueconsole.log (foo.hasownproperty ( 'constructor')); foolog. function); // trueconsole.log (object.hasownproperty ( 'constructor')); // false모든 함수는 생성자 함수 ()의 새로운 작동의 인스턴스화 된 객체로 간주 될 수 있습니다. 그런 다음 기능은 자체 새로운 작업 인스턴스화를 호출 한 결과로 간주 될 수 있습니다.
따라서 함수가 인스턴스 객체 인 경우 생성자는 기능이며 프로토 타입 객체는 기능입니다.
console.log (function .__ proto__ === function.prototype); // trueconsole.log (function.prototype.constructor === function); // trueconsole.log (function.prototype === function); // trueconsole.log (function.prototype === function); // true
function.prototype가 인스턴스 객체 인 경우 프로토 타입 객체는 무엇입니까? 이전과 마찬가지로, 모든 객체는 Object () 생성자의 새로운 작동의 인스턴스화 결과로 간주 될 수 있습니다. 따라서 기능의 프로토 타입 객체는 Object.Prototype이며 프로토 타입 함수는 Object ()입니다.
console.log (function.prototype .__ proto__ === object.prototype); // true
두 번째 부분은 Object.Prototype의 프로토 타입 객체가 Null임을 소개합니다.
Console.log (Object.prototype .__ proto__ === null); // true
요약
【1 function 함수 (함수도 함수이기도 함) 새 함수의 결과이므로 함수는 인스턴스 객체로 사용할 수 있고 생성자는 함수 ()이며 프로토 타입 객체는 기능입니다.
【2 s 객체 (함수는 객체이기도 함) 새 개체의 결과이므로 객체는 인스턴스 객체로 사용할 수 있고 생성자는 Object ()이며 프로토 타입 객체는 Object.Prototype입니다.
propototype의 프로토 타입 객체는 null입니다