まず、参照のためにJSプロトタイプ継承の例を共有します。特定のコンテンツは次のとおりです
1。JSプロトタイプ継承
<!doctype html> <html> <head> <meta charset = "utf-8"> <title> jsプロトタイプ継承</title> </head> <body> <! - プロトタイプ継承 - > <スクリプトタイプ= "text/javascript"> // clone()機能は、新しいクラスのclone = functionを作成するために使用されます。 //この文は、プロトタイプ継承の中核です。関数のプロトタイプオブジェクトは、オブジェクトliteral_f.prototype = objです。新しい_fを返します; } //オブジェクトを宣言しますリテラルfirst var animal = {somthing: 'apple'、eat:function(){console.log( "eat" + this.somthing); }} //人のサブクラスを定義する必要はありません。 //個人が提供するデフォルト値を直接取得することも、属性とメソッドconsole.log(cat.eat())を追加または変更することもできます。 cat.somthing = 'orange'; console.log(cat.eat()); //サブクラスを宣言し、クローニングvar soney = clone(cat)を実行します。 </script> </body> </html>2。JavaScriptプロトタイプの継承の作業原則
JavaScriptがプロトタイプの継承を採用していることはよく知られていますが、実装の1つのインスタンスのみを提供するため、デフォルトでは新しいオペレーターは、その説明は常に混乱しています。プロトタイプの継承とは何か、およびJavaScriptでプロトタイプ継承の使用方法を説明しましょう。
プロトタイプ継承の定義
JSプロトタイプの継承に関する説明を読むと、次のテキストがよく表示されます。
オブジェクトのプロパティを探すとき、JavaScriptは、指定された名前の属性が見つかるまでプロトタイプチェーンを上方に通過します。 - JavaScriptの秘密の庭から
ほとんどのJavaScriptの実装は、__Proto__属性を使用して、オブジェクトのプロトタイプチェーンを表します。この記事では、__Proto__とプロトタイプの違いを確認します。
注:__Proto__は、コードに表示されないはずの非公式の使用法です。ここでは、JavaScriptプロトタイプの継承がどのように機能するかを説明するために使用します。
次のコードは、JSエンジンがプロパティをどのように探しているかを示しています。
関数getProperty(obj、prop){if(obj.hasownproperty(prop))return obj [prop] else if(obj .__ proto__!== null)return getProperty(obj .__ proto__、prop)else return retured}一般的な例を示しましょう。2次元ポイントには、印刷方法を持つことに似た2次元座標XYがあります。
前に述べたプロトタイプ継承の定義を使用して、x、y、およびprintの3つのプロパティを持つオブジェクトポイントを作成します。新しい2次元ポイントを作成するには、新しいオブジェクトを作成する必要があります。これにより、__Proto__属性ポイントがポイントになります。
var point = {x:0、y:0、print:function(){console.log(this.x、this.y); }}; var p = {x:10、y:20、__proto__:ポイント}; p.print(); // 10 20JavaScript奇妙なプロトタイプ継承
混乱しているのは、プロトタイプの継承を教える人は誰もそのようなコードを与えないが、次のコードを与えることです。
関数ポイント(x、y){this.x = x; this.y = y; } point.prototype = {print:function(){console.log(this.x、this.y); }}; var p = new Point(10、20); p.print(); // 10 20これは私が言ったこととは異なります。ここでポイントは関数になり、プロトタイプ属性もあり、新しいオペレーターがあります。これで何が起こっているのですか?
新しいオペレーターの仕組み
クリエイターのブレンダン・アイヒは、JASやC ++などの従来のオブジェクト指向のプログラミング言語とJSをあまり変えないようにしたいと考えていました。これらの言語では、新しいオペレーターを使用して、クラスに新しいオブジェクトをインスタンス化します。そこで彼はJSに新しいオペレーターを書きました。
インスタンスプロパティを初期化するためのC ++にはコンストラクターの概念があるため、新しい演算子は関数をターゲットにする必要があります。
オブジェクトメソッドを1つの場所に配置する必要があります。プロトタイプ言語を使用しているため、関数のプロトタイププロパティに入れます。
新しいオペレーターは、関数fとそのパラメーターを受け入れます:新しいf(引数...)。このプロセスは3つのステップに分かれています。
クラスのインスタンスを作成します。このステップは、空のオブジェクトの__proto__プロパティをf.prototypeに設定することです。
インスタンスを初期化します。関数fはパラメーターに渡され、呼び出され、これはこのインスタンスに設定されています。
インスタンスを返します。
新しい仕組みがわかったので、JSコードに実装できます。
関数new(f){var n = {'__proto__':f.prototype}; /*ステップ1*/ return function(){f.apply(n、arguments); /*ステップ2*/ nutern; /*ステップ3*/}; }彼の仕事の状況の小さな例:
関数ポイント(x、y){this.x = x; this.y = y; } point.prototype = {print:function(){console.log(this.x、this.y); }}; var p1 = new Point(10、20); p1.print(); // 10 20 Console.log(P1 InstanceOf Point); // true var p2 = new(point)(10、20); p2.print(); // 10 20 Console.Log(P2 InstanceOf Point); // 真実JavaScriptの真のプロトタイプ継承
JSのECMA仕様により、プロトタイプ継承に新しいオペレーターを使用することのみが可能です。しかし、偉大なマスターダグラスクロックフォードは、真のプロトタイプ相続を達成するために新しい使用方法を発見しました!彼はObject.create関数を次のように書き留めました。
object.create = function(parent){function f(){} f.prototype = parent;新しいf()を返します。 };これは奇妙に見えますが、非常に簡潔です。新しいオブジェクトを作成し、設定する価値にプロトタイプを作成します。 __proto__を許可する場合、これを書くこともできます。
object.create = function(parent){return {'__proto__':parent}; };次のコードにより、私たちのポイントは実際のプロトタイプの継承を採用することができます。
var point = {x:0、y:0、print:function(){console.log(this.x、this.y); }}; var p = object.create(point); px = 10; py = 20; p.print(); // 10 20結論は
JSプロトタイプの継承とは何か、JSが特定の方法でどのように実装できるかを学びました。ただし、実際のプロトタイプ継承(Object.createや__Proto__など)を使用すると、次の欠点がまだあります。
標準不足:__ Proto__は標準的な使用法でも、不承認の使用もありません。同時に、元のobject.createとdaoyeによって書かれた元のバージョンも異なります。
最適化が悪い:ネイティブオブジェクトであろうとカスタマイズされたオブジェクトであろうと、そのパフォーマンスは新しいものよりもはるかに少なく、前者は後者の10倍遅いです。
上記はこの記事に関するものです。すべての人の学習に役立つことを願っています。