Prototype
16760 ワード
JavaScriptはプロトコルタイプに基づく言語です!
JavaScriptでは、元のオブジェクトをコピーして新しいオブジェクトを作成します.
ここで、オリジナルオブジェクトとは何ですか?
Personオブジェクトを作成すると、Personプロトタイプというオブジェクトが作成されます.
つまり、関数を作成するときは、プロトタイプオブジェクトを同時に作成する必要があります.
生成された関数にはprototypeというpropertyがあり、prototypeオブジェクトを指します.
プロトタイプオブジェクトのコンストラクション関数Propertyとは、オブジェクトの作成時に宣言される関数です.
各専門家は互いに参照し合います!
ユーザオブジェクトにプロトタイプpropertyがあり、ユーザのプロトタイプオブジェクトにコンストラクション関数propertyがあると判断できます.
では、今から新しいオブジェクトを作成しましょう.
新しいオブジェクトを作成したら、コンソールでproto propertyが存在するかどうかを確認できます.
このプロパティは、新しいオブジェクトを作成するときに確認できます.
では、どのような役割を果たしているのでしょうか.
生成された関数のプロトタイプオブジェクトを指し、プロトタイプオブジェクトに関連付けられていることがわかります.
Personのプロトタイプオブジェクトであることが確認できます.
上図に示すように、プロトタイプの構造がわかります.
ここからPerson Prototypeが元のオブジェクトであることがわかります!
これによりJavaScriptのオブジェクトは元のオブジェクト(Person Prototype)に基づいてコピーされていることがわかります.また、元のオブジェクトに関連付けられていることも示します.この接続はプロトタイプリンクと呼ばれ、protoにはこのリンクが含まれています.
JavaScriptで使用されるすべてのオブジェクトは、このようなプロトコル・タイプに基づいて定義され、作成されます.
写真参照(https://evan-moon.github.io/2019/10/23/js-prototype/)
このようなプロトタイプからなるオブジェクト間の関係をプロトタイプチェーンと呼ぶ.
プロトタイプフィルタを使用して、オブジェクト内のプロトタイプを検索できます. choiオブジェクトにsayメソッドが存在しないことを確認する Choiの ソースオブジェクトがsayメソッド を有するかどうかを検証するを確認して使用します.
JavaScriptではObjectです.createメソッドを使用して継承できます.Object.createはIE 8以下の方法をサポートしないので、この方法を使用して継承しなくてもよい.詳細はhttps://gist.github.com/evan-moon/a7e5a51e20d22016ea443a03480765b7...
Object.create()メソッドは、指定したプロトタイプオブジェクトとプロパティを持つ新しいオブジェクトを作成します.
2番目のパラメータとして作成するオブジェクトにオブジェクトタイプとして追加するプロパティを受け入れます.
Propertyを追加すると、オブジェクトは{number:1}オブジェクトだけではありません.definePropertiesメソッドを使用するように、データ記述子とアクセス記述子を指定する必要があります.
Object.createを使用して継承します.
SuperClassをSubClassに継承しましょう.
親コンストラクション関数のコンストラクション関数を呼び出しますが、実行コンテキストをサブコンストラクション関数に変更します.
SubClass.プロトタイプの変更
Object.createを使用してSuperClassを取得します.プロトタイプをソースオブジェクトとする新しいオブジェクトを作成します.サブコンストラクション関数のプロトタイプオブジェクトと親コンストラクション関数のプロトタイプオブジェクトとの間のプロトタイプチェーンを作成します.(親子関係)
SubClass.prototype.コンストラクション関数の変更
親コンストラクション関数のコンストラクション関数のプロトタイプオブジェクトがコピーされているため、現在のコンストラクション関数は親コンストラクション関数SuperClassである可能性があります.SubClassに変換するには、SubClassに変更する必要があります.
(写真https://evan-moon.github.io/2019/10/27/inheritance-with-prototype/参照)
参考資料
https://evan-moon.github.io/2019/10/23/js-prototype/
https://evan-moon.github.io/2019/10/27/inheritance-with-prototype/
https://ko.javascript.info/function-prototype
Prototypeとは?
JavaScriptでは、元のオブジェクトをコピーして新しいオブジェクトを作成します.
ここで、オリジナルオブジェクトとは何ですか?
function Person(name, age){
this.name = name;
this.age = age;
}
Personという関数を定義すると、Personというオブジェクトが作成されます.Personオブジェクトを作成すると、Personプロトタイプというオブジェクトが作成されます.
つまり、関数を作成するときは、プロトタイプオブジェクトを同時に作成する必要があります.
生成された関数にはprototypeというpropertyがあり、prototypeオブジェクトを指します.
プロトタイプオブジェクトのコンストラクション関数Propertyとは、オブジェクトの作成時に宣言される関数です.
各専門家は互いに参照し合います!
function User(){};
console.dir(User);
console.dir(User.prototype);
ユーザオブジェクトにプロトタイプpropertyがあり、ユーザのプロトタイプオブジェクトにコンストラクション関数propertyがあると判断できます.
console.log(User === User.prototype.constructor); //true
したがって,構築関数が生成時に宣言される関数が見られる.では、今から新しいオブジェクトを作成しましょう.
新しいオブジェクトを作成したら、コンソールでproto propertyが存在するかどうかを確認できます.
function Person(name, age){
this.name = name;
this.age = age;
}
const choi = new Person('정은', 24);
console.log(choi); // {__proto__: Object, name, age}
proto
このプロパティは、新しいオブジェクトを作成するときに確認できます.
では、どのような役割を果たしているのでしょうか.
生成された関数のプロトタイプオブジェクトを指し、プロトタイプオブジェクトに関連付けられていることがわかります.
function Person(name, age){
this.name = name;
this.age = age;
}
const choi = new Person('정은', 24);
console.log(choi.__proto__); //Person의 prototype 객체를 확인할 수 있다.
Personのプロトタイプオブジェクトであることが確認できます.
上図に示すように、プロトタイプの構造がわかります.
ここからPerson Prototypeが元のオブジェクトであることがわかります!
これによりJavaScriptのオブジェクトは元のオブジェクト(Person Prototype)に基づいてコピーされていることがわかります.また、元のオブジェクトに関連付けられていることも示します.この接続はプロトタイプリンクと呼ばれ、protoにはこのリンクが含まれています.
プロトタイプチェーン
JavaScriptで使用されるすべてのオブジェクトは、このようなプロトコル・タイプに基づいて定義され、作成されます.
String
、Array
のような対象もこのようにして製造される.写真参照(https://evan-moon.github.io/2019/10/23/js-prototype/)
このようなプロトタイプからなるオブジェクト間の関係をプロトタイプチェーンと呼ぶ.
プロトタイプフィルタを使用して、オブジェクト内のプロトタイプを検索できます.
function Person(name, age){
this.name = name;
this.age = age;
}
Person.prototype.say = function(){
console.log('Hi!');
}
const choi = new Person('정은', 24);
console.log(choi.say()); //Hi!
choiオブジェクトにsayメソッドは存在しません.でもHi!プロトタイプフィルタが使用されているため、出力が表示されます.__proto__
によって元のオブジェクトに上昇します.Object.prototype
に達するまで、元のオブジェクトに沿って上に移動します.プロトタイプ継承の使用
JavaScriptではObjectです.createメソッドを使用して継承できます.Object.createはIE 8以下の方法をサポートしないので、この方法を使用して継承しなくてもよい.詳細はhttps://gist.github.com/evan-moon/a7e5a51e20d22016ea443a03480765b7...
Object.create()メソッドは、指定したプロトタイプオブジェクトとプロパティを持つ新しいオブジェクトを作成します.
Object.create(proto: Object, properties?: Object);
最初のパラメータとして作成するオブジェクトのソースオブジェクト.2番目のパラメータとして作成するオブジェクトにオブジェクトタイプとして追加するプロパティを受け入れます.
Propertyを追加すると、オブジェクトは{number:1}オブジェクトだけではありません.definePropertiesメソッドを使用するように、データ記述子とアクセス記述子を指定する必要があります.
Object.create(Person.prototype, {
number: {
configurable: false,
enumerable: true,
value: 1
}
});
(詳細はhttps://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperties)Object.createを使用して継承します.
function SuperClass(name){
this.name = name;
}
SuperClass.prototype.say = function(){
console.log(`Hi I am ${this.name}`);
}
親としてのSuperClass関数を作成し、sayメソッドをプロトタイプオブジェクトに宣言します.SuperClassをSubClassに継承しましょう.
function SubClass(name){
SuperClass.call(this, name);
}
SubClass.prototype = Object.create(SuperClass.prototype);
SubClass.prototype.constructor = SubClass;
SubClass.prototype.jump = function(){
console.log(`${this.name} is jumping`);
}
SuperClass.call(this) 親コンストラクション関数のコンストラクション関数を呼び出しますが、実行コンテキストをサブコンストラクション関数に変更します.
super
キーワードに似ています.SubClass.プロトタイプの変更
Object.createを使用してSuperClassを取得します.プロトタイプをソースオブジェクトとする新しいオブジェクトを作成します.サブコンストラクション関数のプロトタイプオブジェクトと親コンストラクション関数のプロトタイプオブジェクトとの間のプロトタイプチェーンを作成します.(親子関係)
SubClass.prototype.コンストラクション関数の変更
親コンストラクション関数のコンストラクション関数のプロトタイプオブジェクトがコピーされているため、現在のコンストラクション関数は親コンストラクション関数SuperClassである可能性があります.SubClassに変換するには、SubClassに変更する必要があります.
(写真https://evan-moon.github.io/2019/10/27/inheritance-with-prototype/参照)
参考資料
https://evan-moon.github.io/2019/10/23/js-prototype/
https://evan-moon.github.io/2019/10/27/inheritance-with-prototype/
https://ko.javascript.info/function-prototype
Reference
この問題について(Prototype), 我々は、より多くの情報をここで見つけました https://velog.io/@jeong_eeeun/Prototypeテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol