JavaScript 업그레이드 시리즈 - 원형 상속 및 원형 체인
원형 계승
원형 계승 실현
function Animal(name){
//
this.name = name || 'Animal';
//
this.sleep = function(){
console.log(this.name + " 。");
}
}
//
Animal.prototype.eat = function(food){
console.log(this.name + " "+food);
}
//
function Tiger(){}
Tiger.prototype = new Animal();
Tiger.prototype.name = "Tiger";
var tiger = new Tiger();
console.log(tiger.name);
console.log(tiger.eat('sleep'));
console.log(tiger.sleep());
console.log(tiger instanceof Animal); //true
console.log(tiger instanceof Tiger); //true
원형 사슬
무엇이 원형 체인입니까?원형 체인을 이해하려면 함수 대상,constructor,new,Prototype,proto 등 다섯 가지 개념에서 착수해야 한다.
원형 체인
상속에 대해 이야기할 때 JavaScript는 하나의 구조만 가지고 있다. 대상, 모든 대상은 프로토콜의 속성이 그의 구조 함수의 원형 대상을 가리킨다.이 원형 대상도 자신의 원형 대상이 있다.
함수는prototype 속성을 통해 찾기
조합 상속
function Animal(name){
//
this.name = name || 'Animal';
//
this.sleep = function(){
console.log(this.name + " 。");
}
}
//
Animal.prototype.eat = function(food){
console.log(this.name + " "+food);
}
//
function Tiger(value){
Animal.call(this, value)
}
Tiger.prototype = new Animal();
Tiger.prototype.name = "Tiger";
var tiger = new Tiger();
console.log(tiger.name);
class 키워드 구현
class Parent {
constructor(value) {
this.val = value
}
getValue() {
console.log(this.val)
}
}
class Child extends Parent {
constructor(value) {
super(value)
}
}
let child = new Child(1)
child.getValue() // 1
child instanceof Parent // true
함수 대상
JavaScript에서 함수는 객체입니다.(함수는 일등 공민) 함수를 변수에 부여할 수 있고 매개 변수로 다른 함수에 전달할 수 있으며 속성과 호출 방법을 추가할 수 있다.키워드function에서 정의한 함수는 모두 함수 대상이며, 함수 대상만prototype 속성을 가지고 있다.이 함수의 원형 대상을 가리킨다.
constructor 구조 함수
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
console.log(this.name);
};
}
우리는 일반적으로 대문자로 시작하는 사용자 정의 함수인 Person () 을 만들었습니다.
new
Person () 의 새 인스턴스를 만들려면 new 키워드를 사용해야 합니다.new 호출 구조 함수는 실제로 다음과 같은 네 가지 절차를 거친다.
function Animal(name){
//
this.name = name || 'Animal';
//
this.sleep = function(){
console.log(this.name + " 。");
}
}
//
Animal.prototype.eat = function(food){
console.log(this.name + " "+food);
}
//
function Tiger(){}
Tiger.prototype = new Animal();
Tiger.prototype.name = "Tiger";
var tiger = new Tiger();
console.log(tiger.name);
console.log(tiger.eat('sleep'));
console.log(tiger.sleep());
console.log(tiger instanceof Animal); //true
console.log(tiger instanceof Tiger); //true
무엇이 원형 체인입니까?원형 체인을 이해하려면 함수 대상,constructor,new,Prototype,proto 등 다섯 가지 개념에서 착수해야 한다.
원형 체인
상속에 대해 이야기할 때 JavaScript는 하나의 구조만 가지고 있다. 대상, 모든 대상은 프로토콜의 속성이 그의 구조 함수의 원형 대상을 가리킨다.이 원형 대상도 자신의 원형 대상이 있다.
함수는prototype 속성을 통해 찾기
조합 상속
function Animal(name){
//
this.name = name || 'Animal';
//
this.sleep = function(){
console.log(this.name + " 。");
}
}
//
Animal.prototype.eat = function(food){
console.log(this.name + " "+food);
}
//
function Tiger(value){
Animal.call(this, value)
}
Tiger.prototype = new Animal();
Tiger.prototype.name = "Tiger";
var tiger = new Tiger();
console.log(tiger.name);
class 키워드 구현
class Parent {
constructor(value) {
this.val = value
}
getValue() {
console.log(this.val)
}
}
class Child extends Parent {
constructor(value) {
super(value)
}
}
let child = new Child(1)
child.getValue() // 1
child instanceof Parent // true
함수 대상
JavaScript에서 함수는 객체입니다.(함수는 일등 공민) 함수를 변수에 부여할 수 있고 매개 변수로 다른 함수에 전달할 수 있으며 속성과 호출 방법을 추가할 수 있다.키워드function에서 정의한 함수는 모두 함수 대상이며, 함수 대상만prototype 속성을 가지고 있다.이 함수의 원형 대상을 가리킨다.
constructor 구조 함수
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
console.log(this.name);
};
}
우리는 일반적으로 대문자로 시작하는 사용자 정의 함수인 Person () 을 만들었습니다.
new
Person () 의 새 인스턴스를 만들려면 new 키워드를 사용해야 합니다.new 호출 구조 함수는 실제로 다음과 같은 네 가지 절차를 거친다.
구조 함수는 다른 일반 함수와 별 차이가 없습니다. new 조작 기호를 사용하면 구조 함수로 호출할 수 있습니다.
주의: 구조 함수는 대상을 되돌려주면 새로 만든 대상을 덮어씁니다.
## 구조 함수의 문제
실례를 만들 때 구조 함수는 매번 실행해야 한다
const Tom = new Person('Tom', 12, 'cxy');
const lucy = new Person('lucy', 14, 'dd');
Tom.sayName === lucy.sayName // false
이렇게 하면 모든 실례에 독립된sayName 방법이 있습니다.일반적인 해결 방법은 방법을 원형 체인에 추가하는 것이다.
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
}
Person.prototype.sayName = function (){
console.log(this.name);
}
prototype 원형
우리가 위에서 말한 바와 같이 원형을 사용하는 장점은 모든 대상의 실례를 그가 포함하는 속성과 방법을 공유하게 하는 것이다.
원형 대상
기본적으로 모든 원형 대상은 자동으로constructor 속성을 얻을 수 있습니다. 이 속성은prototype 속성이 있는 함수를 가리키는 바늘을 포함합니다.위에서 우리가 만든 Person.prototype.constructor는 Person을 가리킨다.이 구조 함수를 통해 우리는 원형 대상에 다른 속성과 방법을 추가할 수 있다.
원형에 저장된 값은 대상 실례를 통해 접근할 수 있지만, 원형에 저장된 값은 대상 실례를 통해 다시 쓸 수 없습니다.??만약 우리가 추가한 속성과 방법이 원형 대상의 속성과 방법과 같다면 어떻게 될까
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
}
Person.prototype.sayName = function (){
console.log(this.name);
}
Person.prototype.tag = ' V';
const Tom = new Person('Tom', 12, ' ');
Tom.tag = 'dd';
Tom.sayName = function(){console.log(1)};
우리가 추가한 속성과 방법을 볼 수 있습니다. 이것은 대상의 속성과 방법을 읽는 메커니즘에 의해 결정됩니다.우선 원형에서 찾고, 원형에 없으면 원형 체인에서 찾고, 층층이 위로 찾습니다.
=v=우리가 원형 대상을 수정하면 어떻게 될까 헤헤
function Person(){}
const Tom = new Person();
Person.prototype = {
constructor: Person,
name : "Stone",
age : 28,
job : "Software Engineer",
sayName : function () {
console.log(this.name);
}
};
Tom.sayName(); // Uncaught TypeError: Tom.sayName is not a function
Tom은 태어났을 때 이런 물건이 없었어요. 저처럼 기지가 넘쳤어요.
원생 대상의 원형
원본 대상도 이런 모델을 통해 만들어졌다.
모든 원생 인용 유형은 구조 함수의 원형에 방법을 정의했다.위의 예를 통해 우리는 원생 대상의 원형을 직접 수정하는 방법도 있지만 이런 방식을 추천하지 않으면 원생 방법을 다시 쓸 수 있다.
원형 체인의 문제
이것은 구조 함수에 초기화 파라미터를 전달하는 부분을 생략하였으며, 결과적으로 모든 실례는 기본적으로 같은 속성 값을 얻을 것이다.
참조 유형에 대한 공유 속성
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.friends = ["ZhangSan", "LiSi"];
}
Person.prototype = {
constructor : Person,
sayName : function(){
console.log(this.name);
}
}
const person1 = new Person("dd", 28, "Engineer");
const person2 = new Person("tt", 29, "Teacher");
person2.friends=[]
person1.friends // ["ZhangSan", "LiSi"]
공유 속성이 모두 백업된 것을 볼 수 있습니다.
다음으로 전송:https://juejin.im/post/5cf52ff451882552a826f40c
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.