prototype-中級者への旅


5. proto vs prototype


まず、2つのコンストラクション関数を作成します.
function Person(name, first, second) {
  this.name = name;
  this.first = first;
  this.second = second;
}

function PersonPlus(name, first, second, third) {
  Person(name, first, second);
  this.third = third;
}

var go = new PersonPlus("go", 50, 60, 90);
また,personplusにpersonを継承すると,上のコードのように継承できない.personはまだnewでオブジェクト化されていないからです.私はただ普通の関数を呼び出しただけです.
ここで重要なのは、それをどのように実現するかです.コール関数を使うことです!「オブジェクト済」PersonPlus関数のthisをpersonに呼び出し、Personに代入します.
function PersonPlus(name, first, second, third) {
  Person.call(this, name, first, second);
  this.third = third;
}
次にpersonコンストラクション関数にsumを追加し、personplusコンストラクション関数にavgを追加します.また、kimというPersonplus関数を母体とする新しいオブジェクトをnewで作成したいと考えています.
Person.prototype.sum = function () {
  return this.first + this.second;
};

PersonPlus.prototype.avg = function () {
  return (this.first + this.second + this.thrid) / 3;
};

var kim = new PersonPlus("kim", 10, 20, 30);
そして、PersonPlusコンストラクション関数でpersonのsum関数を継承したいと思います.ここで複雑になったまず、各オブジェクトにはdefaultに含まれるプロパティがあります.__proto__です.__proto__の関係、特にprotoとprototypeの関係を理解する.でも.これは何のくだらない話だ.
このゴーイングは本当に親切に絵で説明してくれました下図を見る.
{:class="img-fluid"}
まずkim.avg()と入力します.では、パソコンはまずkimの中でavg()を探します.もしなかったらkimの__proto__関数で見つけます.そこにもなかったら、間違いが発生します.protoリンクの方向はこのように形成されている.AVg()関数はkimの__proto__にあるので問題ありません.問題はkim.sum()号をやすり落とすことです.__proto__にもないため、エラーが発生しました.ではproto linkを考えるとPersonPlus.prototype.__proto__ = Person.prototypeの論理を書くのは問題ないはずです.
PersonPlus.prototype.__proto__ = Person.prototype;

//또는

PersonPlus.prototype.sum = Person.prototype.sum;

console.log(kim.sum());
// 110
しかし、__proto__は非公式の方法であり、より安全で効率的なObject.create()を使用する.
PersonPlus.prototype = Object.create(Person.prototype);
console.log(kim.avg());
// avg() is not a function
でもこう変えるとPersonplusの原型はPersonの原型を継承しますでは、既存のPersonplusはプロトタイプに追加されたavg()関数が上書きされると、avg()関数は消えます.したがって
PersonPlus.prototype.__proto__ = Object.create(Person.prototype);
console.log(kim.avg());
// 66.66666

//또는

PersonPlus.prototype = Object.create(Person.prototype);
PersonPlus.prototype.avg = function () {
  return (this.first + this.second + this.third) / 3;
};

console.log(kim.avg());
// PersonPlus.prototype를 교체한다음 avg()를 다시 추가하면 사용가능하다.
このようにavg()関数は生存することができます.person.プロトタイプの和関数も使用できます.
P.S:ちなみに、オブジェクトの親を知りたい場合は.(あなたの正体、元のレベルは何ですか…?)객체.constructorと言えます.上の写真を見てください.コンストラクション関数が再び親オブジェクトを指すためです.ここでもっと考えたら
PersonPlus.prototype = Object.create(Person.prototype);
そう言えばPersonPlusプロトタイプはPersonPrototypeに交換したので、PersonPlus.prototype.コンストラクション関数=Person.
実際、クラスを作成し、super()を使用して継承するのは、関数オブジェクト間の継承に比べてずっと簡潔です.しかし、protoリンクを理解することはjavascript中級者への必須の道であり、javascriptを主な言語とする場合は、必ずそれを理解しなければならない.