JavaScriptシリーズを深く理解する (6) 強力なプロトタイプとプロトタイプchain_javascriptスキル
はじめに
JavaScript には従来のクラス継承モデルは含まれていませんが、プロトタイプのプロトタイプ モデルが使用されています。
これは JavaScript の欠点としてよく指摘されますが、プロトタイプベースの継承モデルは実際には従来のクラス継承よりも強力です。従来のクラス継承モデルの実装は簡単ですが、JavaScript でのプロトタイプ継承の実装ははるかに困難です。
JavaScript はプロトタイプ継承に基づいて広く使用されている唯一の言語であるため、2 つの継承モデルの違いを理解するには時間がかかります。今日はプロトタイプとプロトタイプ チェーンについて学びます。
プロトタイプ
10 年前、初めて JavaScript を学んだとき、私は通常次の方法でコードを書きました:
var decmalDigits = 2,
tax = 5;
function add(x, y) {
return x y ;
}
関数subtract(x, y) {
return x - y>}
//alert(add(1, 3));
プロトタイプの使用方法 1:
プロトタイプを使用する前に、コードに小さな変更を加える必要があります:
this.decmalDigits = decmalDigits;
>};
次に、Calculator オブジェクトのプロトタイプ プロパティにオブジェクト リテラルを代入して、Calculator オブジェクトのプロトタイプを設定します。
return x y;
},
subtract: function (x, y) {
return x - y; ;
//alert((new Calculator()).add(1, 3));
このようにして、新しい Calculator オブジェクトの後に add メソッドを呼び出して結果を計算できます。 。
プロトタイプの使用方法 2:
Calculator.prototype = function () { } ();
その利点は、前の投稿ですでに知られています。つまり、プライベート関数をカプセル化し、単純な使用名を return の形式で公開して、パブリック/プライベート効果を実現できます。
コードをコピー
subtract = function (x, y) {
return x - y
}
return {
add: 加算、
subtract: 減算
}
} ();
//alert((new Calculator()).add (11 , 3));
同様に、新しい Calculator オブジェクトを作成し、後で add メソッドを呼び出して結果を計算できます。
もう 1 つのポイント
上記のプロトタイプを使用する場合、プロトタイプ オブジェクトを一度に設定するという制限があります。各属性を設定する方法について説明します。プロトタイプは別途。
コードをコピー
// プロトタイプを使用して BaseCalculator の 2 つのオブジェクト メソッドを拡張します
BaseCalculator.prototype.add = 関数 (x, y) {
戻り x y;
};
BaseCalculator.prototype.subtract = 関数 (x, y) {
戻り x - y; ;
まず、コンストラクターで BaseCalculator オブジェクトを宣言し、10 進数属性 decmalDigits を初期化してから、プロトタイプ属性を通じて add(x,y) とsubtract という 2 つの関数を設定します。 ( x, y)、もちろん、上記の 2 つのメソッドのいずれかを使用することもできます。私たちの主な目的は、BaseCalculator オブジェクトを実際の Calculator のプロトタイプに設定する方法を確認することです。
コードをコピー
return x y>},
subtract : function(x, y) {
return x - y>}
};
上記のコードを作成したら、開始しましょう:
var Calculator = function () {
//各インスタンスの税番号を宣言します
this.tax = 5;
Calculator.prototype = new BaseCalculator( ) ;
Calculator が 2 つの関数 add(x,y) とsubtract(x,y) を統合できるようにするために、Calculator のプロトタイプが BaseCalculator のインスタンスを指していることがわかります。そしてもう 1 つ言っておきたいのは、そのプロトタイプは BaseCalculator のインスタンスであるため、作成した Calculator オブジェクトのインスタンスの数に関係なく、それらのプロトタイプは同じインスタンスを指すということです。
コードをコピーします
コードは次のとおりです:
Calculator のプロトタイプに代入する次のコードにアクセスすると、インスタンスで 10 進数の値にアクセスできません。エラーが発生します。
コードをコピーします
コードは次のとおりです。
コードをコピーします。
コードは次のとおりです。
//前の電卓の add() 関数をオーバーライドします。
プロトタイプ チェーン
プロトタイプをチェーンする前に、最初に次のコードを追加します。
コードをコピー
コードは次のとおりです:
function Foo() {
this.value = 42;
// Bar.prototype.constructor を Bar 自体に修正します
Bar.prototype.constructor = Bar test = new Bar() // Bar の新しいインスタンスを作成します
// プロトタイプ チェーン
test [Bar のインスタンス]
Bar.prototype [Foo のインスタンス]
{ foo: 'Hello World ' }
Foo.prototype
{メソッド: ...};
Object.prototype
{toString: ... /* など */};
上記の例では、テスト オブジェクトは Bar.prototype と Foo.prototype を継承しているため、Foo のプロトタイプ メソッドにアクセスできます。同時に、プロトタイプで定義された Foo インスタンスのプロパティ値にもアクセスできます。 new Bar() は新しい Foo インスタンスを作成するのではなく、そのプロトタイプ上のインスタンスを再利用するため、すべての Bar インスタンスは同じ value プロパティを共有することに注意してください。
プロパティ検索:
オブジェクトのプロパティを探すとき、JavaScript は指定された名前のプロパティが見つかるまで、検索がプロトタイプ チェーンの先頭に到達するまで、プロトタイプ チェーンを上方向に走査します。は、Object.prototype - ただし、指定された属性がまだ見つからない場合は、unknown が返されます。例を見てみましょう:
function foo() {
this.add = function (x, y) {
return x y;
}
foo.prototype.add = function (x, y) {
return x y 10;
}
Object.prototype.subtract = function (x, y) {
return x - y;
}
var f = new foo();
alert(f.add(1, 2)); // 結果は 13 ではなく 3 です。
alert(f.subtract(1, 2)); //結果は -1
もう 1 つ注意する必要があるのは、プロトタイプには任意のタイプのオブジェクトを割り当てることができますが、アトミック タイプの値を割り当てることはできないということです。たとえば、次のコードは無効です。 >
コードをコピーします
hasOwnProperty 関数:
hasOwnProperty は Object.prototype のメソッドです。hasOwnProperty があるため、オブジェクトにプロトタイプ チェーンのプロパティの代わりにカスタム プロパティが含まれているかどうかを判断できます。プロトタイプチェーンを検索せずにプロパティを処理する唯一の関数です。
コードをコピー
foo.bar; // 1
'bar' // true
foo.hasOwnProperty('bar'); // false
foo.hasOwnProperty('goo'); // true
オブジェクトを走査するときに正しい結果を与えることができるのは hasOwnProperty だけですプロパティが役立つ場合があります。 プロトタイプ チェーン上のプロパティを除外するには、オブジェクト自体に定義されたプロパティ以外に方法はありません。
しかし、嫌なことがあります。JavaScript は hasOwnProperty が不法に占有されることを保護しないため、オブジェクトがたまたまこのプロパティを持っている場合、正しい結果を得るには外部の hasOwnProperty 関数を使用する必要があります。
コードをコピー
} // 常に false を返します。
// {} オブジェクトの hasOwnProperty を使用し、その上部と下部を foo に設定します
{}.hasOwnProperty.call(foo, 'bar') // true
;
hasOwnProperty は、オブジェクトにプロパティが存在するかどうかを確認するときに使用できる唯一のメソッドです。同時に、for in ループを使用してオブジェクトを走査する場合は、常に hasOwnProperty メソッドを使用することをお勧めします。これにより、プロトタイプ オブジェクトの展開による干渉が回避されます。
コードをコピーします
コードは次のとおりです:
us for in ステートメントの動作を変更する方法はないため、結果をフィルターしたい場合は、hasOwnProperty メソッドのみを使用できます。コードは次のとおりです。
コードをコピー
// foo 変数は上記の例の変数です。
for(var i in foo) {
if (foo.hasOwnProperty(i)) {
console.log(i) );
}
}
このバージョンのコードが唯一の正しい書き方です。 hasOwnPropertyを使用したので、今回はmooのみが出力されます。 hasOwnProperty が使用されていない場合、ネイティブ オブジェクト プロトタイプ (Object.prototype など) が拡張されるときにこのコードが壊れる可能性があります。
要約: hasOwnProperty を使用し、コードが実行される環境についていかなる仮定も立てず、ネイティブ オブジェクトが拡張されているかどうかも仮定しないことをお勧めします。
まとめ
プロトタイプによって開発コードは大幅に充実しましたが、日常の使用では上記の注意事項のいくつかに注意する必要があります。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











原神 バージョン 4.4 の新しいマップの紹介. 皆さん、原神 4.4 バージョンでは、立月のシー ランタン フェスティバルも始まりました. 同時に、バージョン 4.4 では神羽渓谷と呼ばれる新しいマップ エリアが開始されます。提供された情報によると、沈雨谷は実際には喬営村の一部ですが、プレイヤーはそれを沈雨谷と呼ぶことに慣れています。それでは、新しい地図をご紹介します。原神バージョン 4.4 の新マップのご紹介です。バージョン 4.4 では、立月北部に「陳兪渓谷・上谷」、「陳兪渓谷・南嶺」、「来新山」がオープンします。谷・上谷」。 ※魔神クエスト・第3幕「ドラゴンと自由の歌」プロローグをクリアすると、テレポートアンカーポイントが自動で解放されます。 2. 喬営荘 暖かい春風が再び陳嶼の山野を撫でるとき、香りのよい

スコープ チェーンとプロトタイプ チェーンは、JavaScript の 2 つの重要な概念であり、それぞれスコープと継承の 2 つの中核機能に対応します: 1. スコープ チェーンは、JavaScript で変数アクセスとスコープを管理するために使用されるメカニズムです。関数が作成される実行コンテキストと字句スコープ; 2. プロトタイプ チェーンは、JavaScript で継承を実装するためのメカニズムです。オブジェクト間のプロトタイプ関係に基づいて、オブジェクトのプロパティやメソッドにアクセスするとき、オブジェクト自体がそうでない場合は、定義は、プロトタイプ チェーンに沿って検索されます。

js のオブジェクトであるプロトタイプは、他のオブジェクトのプロパティとメソッドを定義するために使用されます。各コンストラクターには、プロトタイプ属性があります。この属性は、プロトタイプ オブジェクトを指すポインターです。新しいオブジェクトが作成されると、新しいオブジェクトは次のようになります。コンストラクターのprototype属性はプロパティとメソッドを継承します。プロトタイプ チェーンでは、オブジェクトのプロパティにアクセスしようとすると、js はまずオブジェクトにこのプロパティがあるかどうかを確認します。そうでない場合、js はオブジェクトのプロトタイプを参照します。プロトタイプ オブジェクトにこのプロパティがない場合は、原型の原型を探し続ける。

Go 言語と Python は非常に人気のある 2 つのプログラミング言語であり、それぞれに独自の利点と特徴があります。高性能プログラミングに関しても、この 2 つにはいくつかの違いがあります。この記事では、Go 言語と Python を比較して、どちらが高パフォーマンス プログラミングに適しているかを検討します。まず、Go 言語について理解しましょう。 Go 言語は、シンプルさ、効率性、同時実行性に重点を置いて Google によって開発されたオープンソース プログラミング言語です。 Go 言語の設計目標の 1 つは、高パフォーマンスのプログラミング エクスペリエンスを提供することです。軽量のコルーチンがあります (Goro

プロトタイプとプロトタイプ チェーンの違いは次のとおりです。 1. プロトタイプは、オブジェクト間での属性とメソッドの共有と継承を実現するために使用される、いくつかの共有属性とメソッドを含む各オブジェクトが持つ属性です。一方、プロトタイプ チェーンは継承です。このメカニズムは、オブジェクト間の継承関係を定義するオブジェクト間のプロトタイプ関係を通じて実装され、オブジェクトがプロトタイプ オブジェクトのプロパティとメソッドを共有できるようになります。 2. プロトタイプの機能は、オブジェクトの共有プロパティとメソッドを定義することです。複数のオブジェクトが同じプロトタイプ オブジェクトのプロパティとメソッドを共有できるようにするため、プロトタイプ チェーンの機能はオブジェクト間の継承関係などを実現することです。

今日の急速な技術進歩の時代では、プログラミング言語の選択は非常に重要になっています。ソフトウェア開発分野の継続的な発展に伴い、Go言語とPythonは非常に注目を集めている2つのプログラミング言語となっています。この記事では、読者がプロジェクトのニーズに応じて適切なプログラミング言語を選択できるように、Go 言語と Python の比較分析を行います。まず、Go 言語について理解しましょう。 Go 言語は、Google によって開発された静的にコンパイルされたプログラミング言語です。強力な同時処理機能と効率的なガベージ コレクション メカニズムを備えています。

昨年、大規模モデル テクノロジーの広範な適用により、私たちは AI が私たちの働き方をいかに大きく変えたかを目の当たりにしてきました。プログラミングの分野でもAIの介入はプログラマーにこれまでにない利便性をもたらすでしょう。最近、Feishen Technology は、大規模な自社開発コード モデルに基づく AI コード アシスタント FittenCode をリリースしました。これにより、プログラマーはコーディング タスクをより迅速、正確、高品質で完了できるようになり、コーディング効率が大幅に向上し、無料でオープンなサービスに貢献できます。ユーザー!製品の公式 Web サイトのアドレス: https://code.fittentech.com/FittenCode は、前回のリリース以来すぐに人気になりました。開発チームは機能を提供するために 24 時間体制で取り組みました。

js プロトタイプとプロトタイプ チェーンの機能は、オブジェクトの継承を実現し、メモリ領域を節約し、コードのパフォーマンスと保守性を向上させることです。詳細な導入: 1. オブジェクトの継承を実装します。プロトタイプとプロトタイプ チェーンを使用すると、オブジェクトを作成し、別のオブジェクトのプロパティとメソッドを継承できます。新しいオブジェクトを作成するときに、そのプロトタイプを別のオブジェクトにポイントできるため、新しいオブジェクト オブジェクトは、プロトタイプ オブジェクトのプロパティとメソッドにアクセスできます; 2. メモリを節約し、パフォーマンスを向上させます。JavaScript では、各オブジェクトにプロトタイプがあります。プロトタイプ チェーンを通じて、オブジェクトはプロトタイプなどを共有できます。
