JavaScript の通常の関数にはプロトタイプがあります。 JavaScript では、どの関数にもプロトタイプ属性があり、その関数のプロトタイプ オブジェクトを指します。プロトタイプの実際の機能は、クラス (関数) に「パブリック領域」を提供することであり、このパブリック領域で宣言されたプロパティとメソッドは、このクラスを通じて作成されたすべてのオブジェクトからアクセスできるため、メモリ消費量を削減できます。
このチュートリアルの動作環境: Windows7 システム、JavaScript バージョン 1.8.5、Dell G3 コンピューター。
1. 関数を作成する限り、関数は関数のプロトタイプ オブジェクトを指すプロトタイプ属性を自動的に取得します。
fn 関数を作成すると、関数のプロトタイプ オブジェクトであるプロトタイプ属性が自動的に取得され、プロトタイプ オブジェクトがコンストラクター属性を持つことがわかります。この属性は、関数自体 (fn) を指します。
プロトタイプの実際の機能は、クラス (関数) に [パブリック領域] を提供することであり、このパブリック領域で宣言されたプロパティとメソッドには、このクラスを通じて作成されたすべてのオブジェクトからアクセスできます。メモリ消費量を削減します。
2. 関数のプロトタイプ属性はオブジェクトです。
typeof fn.prototype //"object"
プロトタイプ属性はオブジェクトです。したがって、通常のオブジェクトの形式で対応する属性とメソッドにアクセスすることに加えて、どのようにアクセスするか他にアクセスできますか? 毛織物ですか?答えは、関数が 'コンストラクター' として機能する場合、'new キーワードを使用してインスタンスを作成する'、プロトタイプ属性内の対応するプロパティとメソッドにアクセスするためです
function Fn(){ this.name = "CJF"} Fn.prototype.name="CJF1"; Fn.prototype.getName = function(){ return this.name; }var f = new Fn(); f.name;//输出 'CJF'f.getName(); //输出 'CJF'Fn.prototype.getName();//输出 'CJF1'
Yes 関数がコンストラクターとしてインスタンスを作成すると、そのインスタンスはプロトタイプ オブジェクトのメソッドを呼び出すことができることがわかります。このとき、これは f を指します。インスタンス f は、次の属性を持っているため、name 属性にアクセスします。独自の name 属性があり、アクセスできるため、出力 'CJF' には name 属性がありません。その場合、スクリプト エンジンは、現在のオブジェクトの作成に使用された コンストラクターのプロトタイプ をクエリします (アクセスするのと同等です)。 f.constructor.prototype) を検索し、コンストラクター プロトタイプ オブジェクトを見つけます。name 属性は 'CJF1' を返します。 (f とそのプロトタイプ オブジェクトは両方とも name 属性を持ち、オブジェクト自身の属性はプロトタイプ オブジェクトよりも高い優先順位を持ちます)
function Fn(){} Fn.prototype.name="CJF1"; Fn.prototype.getName = function(){ return this.name; }var f = new Fn(); f.name;//输出 'CJF1'f.getName(); //输出 'CJF1'Fn.prototype.getName();//输出 'CJF1'
3. プロトタイプ プロトタイプの「リアルタイム」 object
JavaScript のすべてのオブジェクトは 参照によって渡されるため、新しい関数インスタンスを作成するたびに、独自のプロトタイプのコピーがありません。つまり、プロトタイプ オブジェクトはすべてのインスタンスによって共有されます。関数のプロトタイプ オブジェクトを変更すると、関数によって作成されたすべてのインスタンス オブジェクトのプロトタイプもそれに応じて変更されます。
function Fn(){} Fn.prototype.name="CJF1"; Fn.prototype.getName = function(){ return this.name; }var f = new Fn(); f.name;//输出 'CJF1'f.getName(); //输出 'CJF1'f.getAge();//此时没有实例f并没有getAge方法 浏览器会报错 Uncaught TypeError: f.getAge is not a function//加上后面的就可以正常访问了Fn.prototype.getAge = function(){ return 20; } f.getAge();//20
オブジェクト自身のプロパティとプロトタイプ プロパティが同じ場合、オブジェクト自身のプロパティの優先順位がプロトタイプ プロパティの優先順位よりも高いことを学びましたが、オブジェクトそれ自体にはアクセスしたいプロパティやメソッドがない場合、現在のオブジェクトを作成したコンストラクターの
プロトタイプ (プロトタイプ チェーン) に沿ってアクセスするプロパティを検索します。見つかったら、対応するプロパティが見つかります。対応するプロパティが見つからない場合は、unknown が返されますが、見つかりませんでした。メソッドにアクセスするとエラーが報告されます(そのようなメソッドは存在しないが、メソッドを実行する必要があるため、エラーが報告されます)。
function Fn(){} Fn.prototype.name="CJF1"; Fn.prototype.getName = function(){ return this.name; }var f = new Fn(); f.constructor.prototype == Fn.prototype //true
_proto_ (前後 2 つのアンダースコア) が、オブジェクト、このオブジェクトは Fn.prototype です。インスタンス f が持たない属性またはメソッドにアクセスするときは、この 秘密リンク(_proto_) をたどります。アクセスしたいものを検索し、常に Object.prototype を見つけます。見つかったら、対応するプロパティが返されます。対応するプロパティが見つからない場合は、unknown が返されます。ただし、アクセスするメソッドが見つからない場合は、エラーが報告されます。この秘密のリンクは学習とデバッグのみに使用され、実際の開発には使用されません (Object.getPrototypeOf メソッドを使用することをお勧めします)。
f.toString() を呼び出すと、インスタンス f には toString メソッドがないため、シークレット リンクに沿って Object.prototype が検索されます。これは、Object が最上位の親クラスから他のオブジェクトは直接または間接的に継承され、シークレット リンクがそれを見つけた後、結果がある場合は戻り、そうでない場合は未定義を返すか、エラーを報告します。したがって、Object.prototype._proto__ = null が表示されます。
【関連する推奨事項:JavaScript ビデオ チュートリアル 、プログラミング ビデオ 】
以上が通常の JavaScript 関数にはプロトタイプはありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。