프로토타입은 다른 객체가 속성 상속을 구현할 수 있는 객체입니다. 모든 객체는 상속이 될 수 있으며 모든 객체에는 기본적으로 프로토타입이 있습니다. 프로토타입 자체도 객체이기 때문에 각 프로토타입 자체에는 프로토타입이 있습니다. 모든 객체에는 __proto__로 기록되는 프로토타입 속성이 있습니다. 객체를 정의할 때마다 해당 객체의 __proto__ 속성은 객체의 프로토타입을 가리킵니다. 예는 다음과 같습니다.
var foo = { x: 10, y: 20 };
이 속성은 프로토타입을 지정하지 않아도 예약됩니다. 명확한 포인터가 있으면 연결된 목록이 연결됩니다. 프로토타입 자체에도 가장 진보된 object.prototype인 포인터가 있다는 점에 유의해야 합니다. 예시는 다음과 같습니다.
var a = { x: 10, calculate: function (z) { return this.x + this.y + z } }; var b = { y: 20, __proto__: a }; var c = { y: 30, __proto__: a }; // call the inherited method b.calculate(30); // 60
프로토타입의 원리를 이해한 후, 프로토타입을 어떻게 사용하나요? 즉, 프로토타입의 역할은 무엇인가?
일반 초보자는 기본 JavaScript 구문을 익힌 후 함수 지향 프로그래밍을 사용하세요. 다음 코드:
var decimalDigits = 2, tax = 5; function add(x, y) { return x + y; } function subtract(x, y) { return x - y; } //alert(add(1, 3));
는 각 함수를 실행하여 최종 결과를 얻습니다. 하지만 프로토타입을 사용하면 생성자 를 사용하여 일부 코드를 최적화할 수 있습니다.
먼저 변수만 함수 본문에 저장됩니다.
var Calculator = function (decimalDigits, tax) { this.decimalDigits = decimalDigits; this.tax = tax; };
구체적인 방법은 다음과 같습니다. 설정할 프로토타입 속성:
Calculator.prototype = { add: function (x, y) { return x + y; }, subtract: function (x, y) { return x - y; } }; //alert((new Calculator()).add(1, 3));
이런 방식으로 객체를 인스턴스화하여 해당 기능 작업을 수행할 수 있습니다. 이는 일반적인 js 프레임워크에서도 사용되는 방법입니다.
프로토타입의 또 다른 기능은 상속을 구현하는 것입니다. 먼저 상위 개체를 정의합니다:
var BaseCalculator = function() { this.decimalDigits = 2; }; BaseCalculator.prototype = { add: function(x, y) { return x + y; }, subtract: function(x, y) { return x - y; } };
그런 다음 하위 개체를 정의하고 하위 개체의 프로토타입이 상위 요소의 인스턴스화를 가리킵니다.
var Calculator = function () { //为每个实例都声明一个税收数字 this.tax = 5; }; Calculator.prototype = new BaseCalculator();
계산기의 프로토타입을 볼 수 있습니다. BaseCalculator를 가리키는 것입니다. 인스턴스에서 목적은 Calculator가 add(x,y)와 subtract(x,y)의 두 함수를 통합하도록 하는 것입니다. 또 다른 요점은 해당 프로토타입이 BaseCalculator의 인스턴스이기 때문에 무엇을 생성하든 여러 개의 Calculator 개체 인스턴스가 있으며 해당 프로토타입은 모두 동일한 인스턴스를 가리킵니다.
위 코드를 실행한 후 Calculator의 프로토타입이 BaseCalculator의 인스턴스를 가리키기 때문에 해당decimalDigits 속성 값에 액세스할 수 있음을 알 수 있습니다. 그런 다음 Calculator가 BaseCalculator의 생성자에 액세스하는 것을 원하지 않으면 선언된 속성값, 어떻게 해야 하나요? 인스턴스 대신 BaseCalculator의 프로토타입을 Calculator에 지정하면 됩니다. 코드는 다음과 같습니다.
var Calculator = function () { this.tax= 5; }; Calculator.prototype = BaseCalculator.prototype;
타사 라이브러리를 사용할 때 그들이 정의한 프로토타입 메서드가 우리의 요구 사항을 충족하지 못하는 경우가 있으므로 몇 가지 메서드를 직접 추가할 수 있습니다.
//覆盖前面Calculator的add() function Calculator.prototype.add = function (x, y) { return x + y + this.tax; }; var calc = new Calculator(); alert(calc.add(1, 1));
객체의 프로토타입은 객체의 부모를 가리키고, 부모의 프로토타입은 부모의 부모를 가리킵니다. 이 프로토타입 수준 관계를 프로토타입 체인이라고 합니다.
객체의 속성을 찾을 때 JavaScript는 지정된 이름의 속성을 찾을 때까지 프로토타입 체인을 위쪽으로 순회합니다. 검색이 프로토타입 체인의 맨 위인 Object.prototype에 도달하면 지정된 속성을 아직 찾을 수 없으면 정의되지 않은 상태가 반환됩니다.
예제는 다음과 같습니다.
function foo() { this.add = function (x, y) { return x + y; } } foo.prototype.add = function (x, y) { return x + y + 10; } Object.prototype.subtract = function (x, y) { return x - y; } var f = new foo(); alert(f.add(1, 2)); //结果是3,而不是13 alert(f.subtract(1, 2)); //结果是-1
subtrace는 위쪽을 바라보는 원리를 따르는 반면 add는 사고가 발생하는 것을 확인할 수 있습니다. 그 이유는 속성을 검색할 때 해당 속성이 없으면 먼저 프로토타입 을 검색하기 때문입니다.
Object.prototype에 관해 말하자면, hasOwnProperty라는 메소드 중 하나를 언급해야 합니다. 객체에 프로토타입 체인의 속성이 아닌 사용자 정의 속성이 포함되어 있는지 확인할 수 있습니다. 이는 속성을 처리하지만 프로토타입 체인을 조회하지 않는 JavaScript의 유일한 함수입니다. 사용 코드는 다음과 같습니다.
// 修改Object.prototype Object.prototype.bar = 1; var foo = {goo: undefined}; foo.bar; // 1 'bar' in foo; // true foo.hasOwnProperty('bar'); // false foo.hasOwnProperty('goo'); // true
프로토타입 객체와 인스턴스 간의 관계를 확인하려면 isPrototyleOf 메서드를 도입해야 합니다. 데모는 다음과 같습니다.
alert(Cat.prototype.isPrototypeOf(cat2)); //true
위 내용은 JavaScript 프로토타입에 대한 심층적인 이해(그림)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!