検索
ホームページウェブフロントエンドjsチュートリアルJavaScriptオブジェクト指向プログラミングの基礎_基礎知識

オブジェクト指向を再理解する
JavaScript が完全なオブジェクト指向言語であることを説明するには、まずオブジェクト指向の概念から始めて、オブジェクト指向のいくつかの概念について説明する必要があります。

  1. すべてはオブジェクトです
  2. オブジェクトにはカプセル化と継承の機能があります
  3. オブジェクトはメッセージを使用して相互に通信し、それぞれに情報が隠されています

これら 3 つの点に基づくと、C はクラスのカプセル化、継承、ポリモーフィズムを実装しているものの、非オブジェクトのグローバル関数と変数が存在するため、半オブジェクト指向かつ半手続き型言語です。 Java と C# は完全なオブジェクト指向言語であり、オブジェクトなしでは存在できないように関数と変数をクラスの形式で編成します。しかし、ここでは関数自体がプロセスであり、特定のクラスにアタッチされているだけです。

しかし、オブジェクト指向は単なる概念またはプログラミングのアイデアであり、その存在を特定の言語に依存すべきではありません。たとえば、Java はオブジェクト指向の考え方を使用して言語を構築し、クラス、継承、派生、ポリモーフィズム、インターフェイスなどのメカニズムを実装します。ただし、これらのメカニズムはオブジェクト指向プログラミングを実装するための手段にすぎず、必須ではありません。言い換えれば、言語は、独自の特性に基づいてオブジェクト指向を実装するための適切な方法を選択できます。したがって、ほとんどのプログラマは、最初に Java や C などの高レベルのコンパイル言語を学習または使用するため (Java はセミコンパイルおよびセミインタープリタですが、一般的にはコンパイル言語として説明されます)、「クラス」という用語を先入観で受け入れます。オブジェクト指向の実装方​​法であるため、スクリプト言語を学習する際には、その言語がオブジェクト指向言語であるかどうか、またはオブジェクト指向の特性を備えているかどうかを判断するために、クラスベースのオブジェクト指向言語の概念を使用するのが通例です。これは、プログラマーが JavaScript を深く学習して習得することを妨げる重要な理由の 1 つでもあります。
実際、JavaScript 言語はプロトタイプと呼ばれるメソッドを通じてオブジェクト指向プログラミングを実装します。客観的な世界を構築する 2 つの方法、クラスベースのオブジェクト指向とプロトタイプベースのオブジェクト指向の違いについて説明します。
クラスベースのオブジェクト指向アプローチとプロトタイプベースのオブジェクト指向アプローチの比較
クラスベースのオブジェクト指向アプローチでは、オブジェクトはクラスに基づいて生成されます。プロトタイプベースのオブジェクト指向アプローチでは、オブジェクトはコンストラクターとプロトタイプを使用して構築されます。 2 つの認識方法の違いを説明するために、客観的な世界の例を挙げてください。たとえば、工場で自動車を製造する場合、作業員は設計図を参照する必要があり、その設計によって自動車の製造方法が規定されます。ここでの設計図は言語の授業のようなもので、車はこの授業に基づいて作られますが、作業者や機械(建設業者に相当)はエンジンやタイヤ、ハンドル(部品の各属性に相当)などのさまざまな部品を使用します。プロトタイプ) が車を組み立てます。
実際、2 つの方法のうちどちらがオブジェクト指向のアイデアをより完全に表現しているかについては、まだ議論があります。しかし、著者は、次の理由から、プロトタイプ オブジェクト指向はより徹底したオブジェクト指向のアプローチであると信じています。 まず第一に、客観的な世界におけるオブジェクトの作成は他の物理的なオブジェクトの構築の結果であり、抽象的な「図面」からは「車」を生み出すことはできません。言い換えれば、クラスは実体ではなく抽象的な概念です。オブジェクトの作成はエンティティの作成です。
次に、すべてがオブジェクトであるというオブジェクト指向の最も基本的なルールに従って、クラス自体はオブジェクトではありませんが、プロトタイプ メソッドのコンストラクターとプロトタイプ自体は、構築されたオブジェクトによって別のオブジェクトになります。
第三に、クラスベースのオブジェクト指向言語では、オブジェクトの状態はオブジェクトのインスタンスが保持し、オブジェクトの動作メソッドはオブジェクトを宣言するクラスが保持し、構造とメソッドのみを継承できます。 ; プロトタイプのオブジェクト指向言語では、オブジェクトの動作とステータスはオブジェクト自体に属し、一緒に継承できます (参照リソース)。これは客観的な現実に近いものです。
最後に、Java などのクラスベースのオブジェクト指向言語では、手続き型言語でグローバル関数や変数を使用できない不便さを補うために、クラス内で静的プロパティや静的メソッドを宣言できます。実際、すべてがオブジェクトであるため、客観的な世界にはいわゆる静的な概念は存在しません。プロトタイプのオブジェクト指向言語では、組み込みオブジェクト、グローバル オブジェクト、メソッド、またはプロパティを除いて、存在することは許可されず、静的な概念は存在しません。すべての言語要素 (プリミティブ) は、その存在のためにオブジェクトに依存する必要があります。ただし、関数型言語の特性により、言語要素が依存するオブジェクトは実行時コンテキストの変化に応じて変化し、特に this ポインターの変化に反映されます。この性質は、「すべてのものは何かに属しており、宇宙はすべてのものの生存の基盤である」という自然観に近いものです。


JavaScript オブジェクト指向の基礎知識

JavaScript 自体にはクラスの概念はありませんが、一般的なオブジェクト指向言語とは異なりますが、依然としてオブジェクト指向の特徴を持っています。

オブジェクトを作成する簡単な方法は次のとおりです:

function myObject() {

};

JavaScript 中创建对象的方法一般来说有两种:函数构造法和字面量法,上面这种属函数构造法。下面是一个字面量法的例子:

var myObject = {

};

オブジェクトが 1 つだけ必要で、そのオブジェクトの他のインスタンスが必要ない場合は、リテラル メソッドを使用することをお勧めします。オブジェクトの複数のインスタンスが必要な場合は、関数コンストラクターをお勧めします。
プロパティとメソッドを定義する

関数構築方法:

function myObject() {
 this.iAm = 'an object';

 this.whatAmI = function() {
 console.log('I am ' + this.iAm);
 };
};

リテラルメソッド:

var myObject = {
 iAm : 'an object',

 whatAmI : function() {
 console.log('I am ' + this.iAm);
 }
};

上記の 2 つのメソッドで作成されたオブジェクトには、「iAm」という名前のプロパティと「whatAmI」という名前のメソッドがあります。プロパティはオブジェクト内の変数であり、メソッドはオブジェクト内の関数です。

属性を取得してメソッドを呼び出す方法:

var w = myObject.iAm;

myObject.whatAmI();

メソッドを呼び出すときは、メソッドの後にかっこを追加する必要があります。かっこを追加しない場合は、メソッドへの参照が返されるだけです。
オブジェクトを作成する 2 つの方法の違い

  • 関数コンストラクターでプロパティとメソッドを定義するときは、接頭辞 this を使用する必要がありますが、リテラル メソッドでは必要ありません。
  • 関数コンストラクターはプロパティとメソッドに値を割り当てるときに = を使用し、リテラル メソッドは : を使用します。
  • 複数のプロパティまたはメソッドがある場合は、関数コンストラクターでは ; で、リテラル メソッドでは , で区切る必要があります。

リテラル メソッドで作成されたオブジェクトの場合、オブジェクトの参照を使用してそのプロパティまたはメソッドを直接呼び出すことができます。

myObject.whatAmI();

関数コンストラクターの場合、そのプロパティまたはメソッドを呼び出す前に、オブジェクトのインスタンスを作成する必要があります。

var myNewObject = new myObject();
myNewObject.whatAmI();

コンストラクターを使用する

ここで、前の関数構築方法に戻りましょう:

function myObject() {
 this.iAm = 'an object';
 this.whatAmI = function() {
 console.log('I am ' + this.iAm);
 };
};

実際は関数のように見えますが、関数なのでパラメータを渡すことはできますか?コードを少し変更します:

function myObject(what) {
 this.iAm = what;
 this.whatAmI = function(language) {
 console.log('I am ' + this.iAm + ' of the ' + language + ' language');
 };
};

次に、オブジェクトをインスタンス化し、パラメーターを渡します。

var myNewObject = new myObject('an object');
myNewObject.whatAmI('JavaScript');

プログラムの最終出力は、「私は JavaScript 言語のオブジェクトです」です。
オブジェクトを作成するには 2 つの方法がありますが、どちらを使用すればよいですか?

リテラル メソッドの場合、インスタンス化が必要ないため、オブジェクトの値が変更されると、そのオブジェクトの値は永続的に変更され、その他のアクセスは変更された値になります。関数コンストラクターの場合、値を変更すると、そのインスタンスの値が変更され、N 個のオブジェクトをインスタンス化でき、各オブジェクトは相互に干渉することなく独自の異なる値を持つことができます。次のコード スニペットを比較してください。

まずリテラルメソッドを見てみましょう:

var myObjectLiteral = {
 myProperty : 'this is a property'
};

console.log(myObjectLiteral.myProperty); // log 'this is a property'

myObjectLiteral.myProperty = 'this is a new property';

console.log(myObjectLiteral.myProperty); // log 'this is a new property'

このオブジェクトを指すように新しい変数が作成された場合でも、結果は同じです:

var myObjectLiteral = {
 myProperty : 'this is a property'
};

console.log(myObjectLiteral.myProperty); // log 'this is a property'

var sameObject = myObjectLiteral;

myObjectLiteral.myProperty = 'this is a new property';

console.log(sameObject.myProperty); // log 'this is a new property'

関数の構築方法をもう一度見てください:

// 用函数构造法
var myObjectConstructor = function() {
   this.myProperty = 'this is a property'
};

// 实例化一个对象
var constructorOne = new myObjectConstructor();

// 实例化第二个对象
var constructorTwo = new myObjectConstructor();

// 输出
console.log(constructorOne.myProperty); // log 'this is a property'

// 输出
console.log(constructorTwo.myProperty); // log 'this is a property'

和预期一样,两个对象的属性值是一样的。如果修个其中一个对象的值呢?

// 用函数构造法
var myObjectConstructor = function() {
 this.myProperty = 'this is a property';
};

// 实例化一个对象
var constructorOne = new myObjectConstructor();

// 修改对象的属性
constructorOne.myProperty = 'this is a new property';

// 实例化第二个对象
var constructorTwo = new myObjectConstructor();

// 输出
alert(constructorOne.myProperty); // log 'this is a new property'

// 输出
alert(constructorTwo.myProperty); // log 'this is a property'

ご覧のとおり、関数コンストラクターを使用してインスタンス化されたさまざまなオブジェクトは互いに独立しており、それぞれが異なる値を持つことができます。したがって、どの方法でオブジェクトを作成するかは、実際の状況によって異なります。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Python vs. JavaScript:開発環境とツールPython vs. JavaScript:開発環境とツールApr 26, 2025 am 12:09 AM

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。

JavaScriptはCで書かれていますか?証拠を調べるJavaScriptはCで書かれていますか?証拠を調べるApr 25, 2025 am 12:15 AM

はい、JavaScriptのエンジンコアはCで記述されています。1)C言語は、JavaScriptエンジンの開発に適した効率的なパフォーマンスと基礎となる制御を提供します。 2)V8エンジンを例にとると、そのコアはCで記述され、Cの効率とオブジェクト指向の特性を組み合わせて書かれています。3)JavaScriptエンジンの作業原理には、解析、コンパイル、実行が含まれ、C言語はこれらのプロセスで重要な役割を果たします。

JavaScriptの役割:WebをインタラクティブでダイナミックにするJavaScriptの役割:WebをインタラクティブでダイナミックにするApr 24, 2025 am 12:12 AM

JavaScriptは、Webページのインタラクティブ性とダイナミズムを向上させるため、現代のWebサイトの中心にあります。 1)ページを更新せずにコンテンツを変更できます。2)Domapiを介してWebページを操作する、3)アニメーションやドラッグアンドドロップなどの複雑なインタラクティブ効果、4)ユーザーエクスペリエンスを改善するためのパフォーマンスとベストプラクティスを最適化します。

CおよびJavaScript:接続が説明しましたCおよびJavaScript:接続が説明しましたApr 23, 2025 am 12:07 AM

CおよびJavaScriptは、WebAssemblyを介して相互運用性を実現します。 1)CコードはWebAssemblyモジュールにコンパイルされ、JavaScript環境に導入され、コンピューティングパワーが強化されます。 2)ゲーム開発では、Cは物理エンジンとグラフィックスレンダリングを処理し、JavaScriptはゲームロジックとユーザーインターフェイスを担当します。

Webサイトからアプリまで:JavaScriptの多様なアプリケーションWebサイトからアプリまで:JavaScriptの多様なアプリケーションApr 22, 2025 am 12:02 AM

JavaScriptは、Webサイト、モバイルアプリケーション、デスクトップアプリケーション、サーバー側のプログラミングで広く使用されています。 1)Webサイト開発では、JavaScriptはHTMLおよびCSSと一緒にDOMを運用して、JQueryやReactなどのフレームワークをサポートします。 2)ReactNativeおよびIonicを通じて、JavaScriptはクロスプラットフォームモバイルアプリケーションを開発するために使用されます。 3)電子フレームワークにより、JavaScriptはデスクトップアプリケーションを構築できます。 4)node.jsを使用すると、JavaScriptがサーバー側で実行され、高い並行リクエストをサポートします。

Python vs. JavaScript:ユースケースとアプリケーションと比較されますPython vs. JavaScript:ユースケースとアプリケーションと比較されますApr 21, 2025 am 12:01 AM

Pythonはデータサイエンスと自動化により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、データ処理とモデリングのためにNumpyやPandasなどのライブラリを使用して、データサイエンスと機械学習でうまく機能します。 2。Pythonは、自動化とスクリプトにおいて簡潔で効率的です。 3. JavaScriptはフロントエンド開発に不可欠であり、動的なWebページと単一ページアプリケーションの構築に使用されます。 4. JavaScriptは、node.jsを通じてバックエンド開発において役割を果たし、フルスタック開発をサポートします。

JavaScript通訳者とコンパイラにおけるC/Cの役割JavaScript通訳者とコンパイラにおけるC/Cの役割Apr 20, 2025 am 12:01 AM

CとCは、主に通訳者とJITコンパイラを実装するために使用されるJavaScriptエンジンで重要な役割を果たします。 1)cは、JavaScriptソースコードを解析し、抽象的な構文ツリーを生成するために使用されます。 2)Cは、Bytecodeの生成と実行を担当します。 3)Cは、JITコンパイラを実装し、実行時にホットスポットコードを最適化およびコンパイルし、JavaScriptの実行効率を大幅に改善します。

JavaScript in Action:実際の例とプロジェクトJavaScript in Action:実際の例とプロジェクトApr 19, 2025 am 12:13 AM

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール