コンストラクション関数とプロトタイプオブジェクト
4065 ワード
JAvascriptは、コンストラクション関数とプロトタイプオブジェクトを使用してオブジェクト向けプログラミングを行います.
コンストラクタ
JavaScriptでは、コンストラクタは実際には一般的な関数です.newオペレータを使用してこの関数を作用させる場合、構築方法(構築関数)と呼ぶことができます.大文字で作成関数(Capitalizing Constructors) コンストラクタはnewでオブジェクトを作成する です.必要に応じて、コンストラクション関数はパラメータを受け入れることができ、パラメータがなければ括弧 を省略することができる. newオペレータの使用を忘れた場合、thisはグローバルオブジェクトwindow を表します. constructor.各オブジェクトは、作成時に自動的にコンストラクション関数プロパティconstructorを持ち、コンストラクション関数への参照が含まれます.このconstructor属性は実際にはプロトタイプオブジェクトから継承され、constructorもプロトタイプオブジェクトの唯一の固有属性 である.戻り値:関数のreturn文は、関数呼び出し後の戻り値を返すために使用されますが、newコンストラクション関数の戻り値は少し特殊です.コンストラクション関数がreturn文を使用するが、戻り値が指定されていない場合、または元の値が返される場合、戻り値は無視され、呼び出し結果 としてこの新しいオブジェクトが使用されます. instanceofオペレータは、オブジェクトのタイプを識別するために使用することができ、newを失ったコンストラクション関数の解決策は、コンストラクション関数の内部でinstanceofを使用してnewコマンドを使用するかどうかを判断することであり、使用されていないことが発見された場合、return文を直接使用してインスタンスペア を返す.
プロトタイプオブジェクト
コンストラクション関数の属性とメソッドがオブジェクトインスタンスで共有できないという問題を解決するために、共有する必要がある属性とメソッドをプロトタイプオブジェクトに置くことができます.プロトタイプオブジェクト上のすべてのプロパティとメソッドは、オブジェクトインスタンスによって共有されます.コンストラクション関数にとってprototypeはコンストラクション関数としての属性である.オブジェクトインスタンスの場合、prototypeはオブジェクトインスタンスのプロトタイプオブジェクトです.だからprototypeは属性であり、オブジェクトでもある.
constructorプロパティは、すべてのインスタンスオブジェクトで共有できるプロトタイプオブジェクト上のプロパティです.prototypeはコンストラクション関数のプロパティであり、constructorはコンストラクション関数のprototypeプロパティが指すオブジェクト、すなわちプロトタイプオブジェクトのプロパティであることに注意してください.constructorプロパティはプロトタイプオブジェクトとコンストラクション関数の関係であるため、プロトタイプオブジェクトを修正する際にはconstructorの指向問題に注意しなければならない.
コンストラクション関数とプロトタイプの組合せモード
プロトタイプチェーンの特徴は
a:オブジェクトの属性を読み取る場合、JavaScriptエンジンはまずオブジェクト自体の属性を探し、見つからない場合はその原型を探し、見つからない場合は原型の原型を探します.最上位レベルのObject.prototypeまで見つからない場合はundefinedを返します.
b:オブジェクト自体とそのプロトタイプが同じ名前のプロパティを定義している場合、オブジェクト自体のプロパティを優先的に読み込みます.これをオーバーライド(overiding)と呼びます.
c:一級上にプロトタイプチェーンで属性を探し、性能に影響を与える.探したプロパティが上位レベルのプロトタイプオブジェクトほど、パフォーマンスに与える影響が大きくなります.存在しないプロパティを検索すると、プロトタイプチェーン全体が遍歴します.
コンストラクタ
JavaScriptでは、コンストラクタは実際には一般的な関数です.newオペレータを使用してこの関数を作用させる場合、構築方法(構築関数)と呼ぶことができます.
{
function Person(){
this.name ='millet'
}
let person1 =new Person();
console.log(person1.name)//millet
}
{
function Person(){
this.name ='millet'
}
let person1 =new Person;
console.log(person1.name)//millet
}
{
function Person(){
this.name ='millet'
}
let person1 =Person;
console.log(person1.name)//Uncaught TypeError: Cannot read property 'name' of undefined
}
{
function Person(){
this.name ='millet'
}
let person1 =new Person();
console.log(person1)//
**
Person {
name:"millet"
__proto__:
constructor:ƒ Person()
arguments:null
caller:null
length:0
name:"Person"
prototype:{constructor: ƒ}
__proto__:ƒ ()
[[FunctionLocation]]:VM206:3
[[Scopes]]:Scopes[1]
__proto__:Object
}
**
console.log(person1.constructor === Person)//true
console.log(person1.__proto__.constructor === Person)//true
}
{
function Person(){
this.name ='millet'
return;
}
let person1 =new Person;
console.log(person1)//{name:"millet"}
}
{
function Person(){
this.name ='millet'
}
let person1 =new Person;
console.log(person1 instanceof Person)//true
}
** **
{
function Person(){
if(!(this instanceof Person)){
return new Person()
}
this.name ='millet'
}
let person1 =Person;
console.log(person1.name)//millet
let person2 =new Person;
console.log(person1.name)//millet
}
プロトタイプオブジェクト
コンストラクション関数の属性とメソッドがオブジェクトインスタンスで共有できないという問題を解決するために、共有する必要がある属性とメソッドをプロトタイプオブジェクトに置くことができます.プロトタイプオブジェクト上のすべてのプロパティとメソッドは、オブジェクトインスタンスによって共有されます.コンストラクション関数にとってprototypeはコンストラクション関数としての属性である.オブジェクトインスタンスの場合、prototypeはオブジェクトインスタンスのプロトタイプオブジェクトです.だからprototypeは属性であり、オブジェクトでもある.
{
function Person(){
this.name ='millet'
}
let person1 =Person;
:
console.log(person.prototype=== Person1.__proto__ )//true
:
console.log(Person.prototype.constructor === Person)//true
, constructor :
console.log(person1.constructor === Person)//true
}
constructorプロパティは、すべてのインスタンスオブジェクトで共有できるプロトタイプオブジェクト上のプロパティです.prototypeはコンストラクション関数のプロパティであり、constructorはコンストラクション関数のprototypeプロパティが指すオブジェクト、すなわちプロトタイプオブジェクトのプロパティであることに注意してください.constructorプロパティはプロトタイプオブジェクトとコンストラクション関数の関係であるため、プロトタイプオブジェクトを修正する際にはconstructorの指向問題に注意しなければならない.
コンストラクション関数とプロトタイプの組合せモード
{
function Person(){
this.name ='millet'
}
Person.prototype ={
constructor:Person,// , console.log(person1.constructor === Person);//false
say: function(){
cosole.log(this.name )
}
}
let person1 =new Person;
console.log(person1.name)//millet
}
プロトタイプチェーンの特徴は
a:オブジェクトの属性を読み取る場合、JavaScriptエンジンはまずオブジェクト自体の属性を探し、見つからない場合はその原型を探し、見つからない場合は原型の原型を探します.最上位レベルのObject.prototypeまで見つからない場合はundefinedを返します.
b:オブジェクト自体とそのプロトタイプが同じ名前のプロパティを定義している場合、オブジェクト自体のプロパティを優先的に読み込みます.これをオーバーライド(overiding)と呼びます.
c:一級上にプロトタイプチェーンで属性を探し、性能に影響を与える.探したプロパティが上位レベルのプロトタイプオブジェクトほど、パフォーマンスに与える影響が大きくなります.存在しないプロパティを検索すると、プロトタイプチェーン全体が遍歴します.