우리가 만드는 모든 함수에는 특정 유형의 모든 인스턴스에서 공유할 수 있는 속성과 메서드가 포함된 객체인 프로토타입 속성이 있습니다. 이를 사용하면 모든 객체 인스턴스가 포함된 속성과 메서드를 공유할 수 있다는 것입니다. 즉, 생성자에서 객체 정보를 정의할 필요가 없지만 이 정보를 프로토타입 객체에 직접 추가할 수 있습니다. 다음과 같이 처음 두 블로그의 예제를 계속해서 다시 작성합니다.
function Employee() {
};
Employee.prototype.Name = "Jim";
Employee.prototype.Age = 28; = "소프트웨어 엔지니어";
Employee.prototype.SayName = function () {
alert(this.Name);
var Employees1 = new Employee(); SayName();//Jim
var emplayee2 = new Employee();
emplayee2.SayName(); //Jim
alert(employee1.SayName = emplayee2.SayName);//true
with 생성자 패턴과의 차이점은 새 개체의 이러한 속성과 메서드가 모든 인스턴스에서 공유된다는 것입니다.
위는 프로토타입 모드에 대한 소개입니다. 프로토타입 모드의 작동 원리를 이해하려면 ECMASCRIPT에서 프로토타입의 성격을 이해해야 합니다.
프로토타입 이해
Javascript에서는 새 함수가 생성될 때마다 특정 규칙 집합에 따라 해당 함수에 대한 프로토타입 속성이 생성됩니다. 기본적으로 프로토타입 속성이 있더라도 자동으로 생성자 속성을 얻습니다. 이 속성에는 프로토타입 속성이 있는 함수에 대한 포인터가 포함되어 있습니다. 이 생성자를 통해 프로토타입에 다른 속성과 메서드를 계속 추가할 수 있습니다. .
사용자 정의 생성자를 생성한 후 해당 프로토타입 속성은 기본적으로 생성자 속성만 가져오고 다른 메서드는 Object에서 상속됩니다. 새 인스턴스를 생성하기 위해 생성자가 호출되면 인스턴스에는 생성자의 프로토타입 속성을 가리키는 포인터(내부 속성)가 포함됩니다. 이 연결은 인스턴스와 생성자 사이가 아니라 인스턴스와 생성자 프로토타입 속성 사이에 존재합니다.
일부 구현에서는 내부 속성(_proto_properties)에 액세스할 수 없지만 모든 구현에서는 isPrototypeOf 메서드를 통해 객체 간에 이 프로토타입 관계가 존재하는지 여부를 확인할 수 있습니다. 기본적으로 이 메서드는 객체의 _proto_ 속성이 isPrototypeOf를 가리키는 경우 true를 반환합니다. 아래와 같습니다.
코드 복사
코드는 다음과 같습니다. alert(Employee.prototype .isPrototypeOf(employee1)); //true
alert(Employee.prototype.isPrototypeOf(employee2));//true
코드가 객체의 속성을 읽을 때마다 실행됩니다. ,주어진 이름을 가진 속성을 대상으로 합니다. 검색은 객체 인스턴스 자체부터 시작됩니다. 주어진 이름을 가진 속성이 인스턴스에서 발견되면 해당 속성의 값이 발견됩니다. 발견되지 않으면 포인터가 가리키는 프로토타입 객체를 통해 검색이 계속되며 프로토타입에서 주어진 이름을 가진 속성을 찾습니다. 물체. 이 속성이 프로토타입 객체에 있으면 이 속성의 값이 반환됩니다. 이는 프로토타입이 저장한 속성과 메소드를 객체 인스턴스 간에 공유하는 기본 원칙입니다.
앞서 언급했듯이 프로토타입에는 초기에 생성자 속성만 포함되어 있으며 이 속성도 공유되므로 객체 인스턴스를 통해 액세스할 수 있습니다.
프로토타입에 저장된 값은 객체 인스턴스를 통해 액세스할 수 있습니다. , 객체 인스턴스를 통해 재정의할 수 없습니다. 인스턴스에 속성을 추가하고 해당 속성이 인스턴스 프로토타입의 속성과 동일한 이름을 갖는 경우 인스턴스에서 생성된 이름 속성은 ( .net이 숨겨짐) 프로토타입의 해당 속성은 다음과 같습니다. 표시:
};
Employee.prototype.Name = "Jim";
Employee.prototype.Age = 28
Employee.prototype.Job = " 소프트웨어 엔지니어";
Employee.prototype.SayName = function () {
alert(this.Name);
};
emplayee2.Name = "Sun";
alert(employee1. Name); //Jim
alert(employee2.Name); //Sun
employee1.Name의 Jim은 프로토타입에서 가져오고, Employee2.Name의 sun은 인스턴스에서 가져옵니다. .