JavaScriptは、C言語の後に接触した2番目のプログラミング言語です。新入生の夏休みの間に、私は図書館で中国語のJavaScriptプログラミングを見つけました。当時、私はプログラミングの初心者でした。さらに、この本はJavaScriptのプログラミングメカニズムについてまったく言及しておらず、誤解を招く言葉がいくつかありました。 JavaScriptはブラウザで実行されるオブジェクト指向の言語であると信じて、私は常にJavaScriptの深い誤解を抱いてきました。 JavaScriptで混乱し、誤解されているこの記事を書き留めます。もちろん、著者のレベルが限られており、開発の経験がないため、必然的に省略があり、批判と修正が行われることを願っています。
JavaScriptオブジェクト
オブジェクトは何ですか
新しいキーワードは、JavaScriptコードのどこにでも見ることができます。これは、JavaScriptがJavaのようにクラスの継承に基づいた言語であると誤解しやすいことです。しかし、そうではありません。 JavaScriptにはクラスはありません。では、クラスではないJavaScriptのオブジェクトは何ですか?ある意味では、JavaScriptオブジェクトはPythonの辞書(ハッシュテーブル)であり、実際にはこれと同様のキー価値ペアです。
me = {"fisrtname": "seek"、 "lastname": "truth"、 "getName":function(){return this.firstname+this.lastname; //これは、このオブジェクトへのポインターに相当します}}これはかなり誤解です。私が最初にそれを見たとき、私は少し理解できないと感じましたが、それでも慎重に使用することは合理的だと感じました。 []オペレーターを使用して、Pythonなどの要素を取得したり、使用したりできます。要素を取得するオペレーター:
me.firstname // => seekme ["lastname"] // => truthme.getname()// => seektruth
新しいオペレーター
JavaScriptにはクラスがないので、新しいオペレーターは何をしていますか?これは、JavaScriptデザインの最も誤解を招く側面の1つです。 JavaScriptは機能的なプログラミング言語です。 JavaScriptの関数は一流の市民であり、JavaScriptの関数もオブジェクトです。関数オブジェクトは、作成されるときに呼び出す属性に追加されます。さらに落とし穴は、JavaScript関数を呼び出す2つの方法があることです。 1つは新しいキーワードで呼び出すことであり、もう1つは新しいキーワードなしで呼び出すことです。前者はオブジェクトを返し、後者はreturnステートメントの内容を返します。次の機能を検討してください。
function obj(name){this.name = name;返品名;}新しいオペレーターを使用して電話をかけた場合:
obj = new obj( "seektruth")// objはオブジェクトになります:{"name": "seektruth"}
直接電話する場合:
obj = obj( "seektruth")// objは文字列になります: "seektruth"
それは確かに非常にトリッキーなデザインです。電話をかけるときは、新規を使用する必要があるかどうかを区別する必要があります。一般的に、新しいキーワードを使用する必要がある関数は、大文字化から始まります。
もう1つのトリッキーなことは、返された返品値がオブジェクトである場合、次のことです。
function obj(name){this.name = name;戻る {};}このようにして、新しいオペレーターに電話するかどうかに関係なく、Return Statementの値を返します。
new obj( "seektruth")// => {} obj( "seektruth")// => {}それは一体何をデザインしていますか...
オブジェクト継承
プロトタイプ
前述のように、JavaScriptにはクラスはありません。JavaScriptはどのように継承を実装していますか?答えは、プロトタイプチェーンを使用しています。 JavaScriptでは、各オブジェクトにはプロトタイプがあります。オブジェクトを作成する場合、指定されていない場合、オブジェクトによって継承されたプロトタイプはobject.prototypeです。関数オブジェクトはfunction.prototype(function.prototype継承object.prototype)を継承します。
object.prototype // => {} function.prototype // => [function]オブジェクトの親しみやすさを使用して、オブジェクトのプロトタイプを表示できます。
a = {} a .__ proto__ // => {}JavaScriptは、オブジェクトのプロトタイプを指定することにより継承を実装します。オブジェクトのプロトタイプを指定する主な方法は3つあります。 1つは、コンストラクターにプロトタイプを示すこと、2つ目はオブジェクトの__Proto__属性を直接変更することであり、3つ目はObject.create関数を使用することです。順番に見てみましょう。
コンストラクターのプロトタイプを指定します
コンストラクター内のオブジェクトのプロトタイプを指定できます。
me = {"firstName": "seek"、 "lastName": "struth"、 "getName":function(){return this.firstname+this.lastname; //これは、このオブジェクトへのポインターに相当します}} function obj(name){this.firstname = name;この.__ proto__ = me; //プロトタイプをMEオブジェクトとして指定}プロトタイプを指定した後、新しいオブジェクトを作成した後、プロトタイプのプロパティにアクセスできます。
obj = new obj( "foo"); // => {firstName: 'foo'} obj.firstname // => fooobj.lastname // => truthobj.getname()// => "footruth"オブジェクトにアクセスするときは、最初に変更されたオブジェクト内のプロパティを見つけようとします。そうでない場合は、プロトタイプに戻ってObject.prototypeまで検索します。プロトタイプ内のプロパティ(メソッド)を新しいオブジェクトで書き換えると、それを使用すると、新しく記述されたプロパティ(メソッド)がプロトタイプの定義を上書きします。
OBJオブジェクトがプロトタイプのプロパティを探しているため、プロトタイプMEオブジェクトの最後の名前のプロパティが変更された場合、OBJオブジェクトの最後の名前のプロパティも変更されます。
me.lastname = "me" obj.lastname // => "me" obj.getname()// => "foome"
オブジェクトのプロトタイプを直接変更します
また、オブジェクトのプロトタイプを直接指定(変更)することもできます。
obj2 = {} obj2 .__ proto__ = meobj2.firstname // => seekobj2.lastname // => "me" obj2.getname()// => "seekme"Object.create関数を使用します
最初の2つの方法は問題を解決できますが、JavaScriptはクラスベースの言語ではなく、最初の執筆方法は誤解が容易であるため、これらの2つの執筆方法はエレガントではありません。 JavaScript言語のエッセンスの著者であるCrockfordは、NewがJavaScript言語に表示されるべきではないと考えており、Object.create関数を使用してプロトタイプに基づいてオブジェクトを作成することをお勧めします。 Object.create関数の使用法は非常に単純です:
obj3 = object.create(me)//プロトタイプとして私と一緒に新しいオブジェクトを作成するobj3.firstname // => seekobj3.lastname // => "me" obj3.getname()// => "seekme"
obj3 = object.create(me)はobj2 = {}; obj2.proto = meに相当しますが、前者はよりエレガントで理解しやすいと書かれています。
要約します
プロトタイプベースの機能的なプログラミング言語として、JavaScriptにはデザインに多くの優雅さと力がありますが、同時に多くのドロスと落とし穴があります。ほとんどの場合、JavaScriptは最も誤解されている言語でもあります。 JavaScriptのオブジェクト継承メカニズムを学習した後、私のレベルは大幅に改善されたと感じています。
JavaScriptオブジェクトと継承に関する上記の簡単な議論は、私があなたと共有するすべてのコンテンツです。私はそれがあなたに参照を与えることができることを願っています、そしてあなたがwulin.comをもっとサポートできることを願っています。