目次
はじめに
名前空間
ネストされた名前空間
オブジェクト
ネイティブ オブジェクト
ホスト オブジェクト
ユーザー オブジェクト
オブジェクト リテラル
Constructor
コンストラクターを定義する
方法和原型
继承性
ホームページ ウェブフロントエンド jsチュートリアル JavaScript によるオブジェクト指向プログラミングの詳細な紹介

JavaScript によるオブジェクト指向プログラミングの詳細な紹介

Mar 04, 2017 pm 03:54 PM
javascript

はじめに

JavaScript は強力なオブジェクト指向プログラミング言語ですが、従来のプログラミング言語とは異なり、プロトタイプベースの OOP モデルを使用しているため、ほとんどの開発者にとってその構文は理解できません。さらに、JavaScript は関数をプライマリ オブジェクトとして扱うため、言語に詳しくない開発者にとっては大きな混乱を引き起こす可能性があります。そのため、これを簡単な紹介として前面に掲載することにしました。また、JavaScript でのオブジェクト指向プログラミングのリファレンスとしても使用できます。

このドキュメントは、オブジェクト指向プログラミングのルールのプレビューを提供するものではなく、そのインターフェイスの概要を提供します。

名前空間

サードパーティのライブラリ、フレームワーク、および Web 依存関係がますます登場するため、JavaScript の開発では名前空間が不可欠になっており、グローバルな名前空間の競合を回避する必要があります。

残念ながら、JavaScript は名前空間のコンパイルをサポートしていませんが、オブジェクトを使用して同じ結果を達成することができます。 JavaScript では、名前空間インターフェイスを実装するためのパターンが多数ありますが、ここでは、この分野で最も一般的に使用されるパターンであるネストされた名前空間について説明します。

ネストされた名前空間

ネストされた名前空間パターンは、オブジェクト リテラルを使用して、特定のアプリケーションの特定の名前を持つ機能をバンドルします。

最初にグローバル オブジェクトを作成し、それを MyApp という変数に割り当てます。

// global namespace
var MyApp = MyApp || {};
ログイン後にコピー

上記の構文は、MyApp が定義されているかどうかを確認します。すでに定義されている場合は、それを自分自身に割り当てるだけですが、代わりに関数と変数を保持する空のコンテナーを作成します。

同じ手法を使用してサブ名前空間を作成することもできます。例:

// sub namespaces
MyApp.users = MyApp.user || {};
ログイン後にコピー

コンテナを開始すると、既存の定義と競合する危険を冒さずに、(コンテナ) 内で関数と変数を定義し、グローバル名前空間でそれらを呼び出すことができます。

// declarations

MyApp.users = {

	existingUsers: '', // variable in namespace

	renderUsersHTML: function() { // function in namespace

		// render html list of users

	}

};

// syntax for using functions within our namespace from the global scope

MyApp.users.renderUsersHTML();
ログイン後にコピー

JavaScript 命名パターンの内部概要は、Goggle の Addy Osmani によって記事「Essential JavaScript Namespacing Patterns」で紹介されました。さまざまなモードを試してみたい場合は、ここから始めるのが最適です。

オブジェクト

JavaScript コードを書いたことがあるなら、すでにオブジェクトを使用したことがあるでしょう。 JavaScript には 3 種類のオブジェクトがあります:

ネイティブ オブジェクト

ネイティブ オブジェクトは言語仕様の一部であり、実行されるオペレーティング環境に関係なく使用できます。ネイティブ オブジェクトには、Array、Date、Math、parseInt などが含まれます。すべてのネイティブ オブジェクトについて詳しくは、JavaScript 組み込みオブジェクト リファレンスを参照してください

var cars = Array(); // Array is a native object
ログイン後にコピー

ホスト オブジェクト

ネイティブ オブジェクトとは異なり、ホスト オブジェクトは JavaScript コードが実行される環境によって作成されます。環境が異なれば、異なるホスト オブジェクトが作成されます。これらのホスト オブジェクトを使用すると、ほとんどの場合、ホスト オブジェクトと対話できます。ブラウザ (実行環境の 1 つ) 上で実行されるコードを作成する場合、ウィンドウ、ドキュメント、場所、履歴などのホスト オブジェクトが存在します。

document.body.innerHTML = 'Hello World!'; // document is a host object

// the document object will not be available in a 
// stand-alone environments such as Node.js
ログイン後にコピー

ユーザー オブジェクト

ユーザー オブジェクト (または埋め込まれたオブジェクト) は、コード内で定義され、実行時に作成されるオブジェクトです。 JavaScript で独自のオブジェクトを作成するには 2 つの方法があります。詳細は以下で説明します。

オブジェクト リテラル

名前空間を作成する前のデモで、すでにオブジェクト リテラルについて触れました。ここで、オブジェクト リテラルの定義を明確にしましょう。オブジェクト リテラルは、中括弧のペアで囲まれた名前と値のペアのコンマ区切りのリストです。オブジェクト リテラルには変数 (プロパティ) と関数 (メソッド) を含めることができます。 JavaScript の他のオブジェクトと同様に、関数のパラメーターまたは戻り値としても使用できます。

ここでオブジェクト リテラルを定義し、それを変数に割り当てます:

// declaring an object literal

var dog = {

	// object literal definition comes here...

};
ログイン後にコピー

このオブジェクト リテラルにプロパティとメソッドを追加し、グローバル スコープでそれらにアクセスします:

// declaring an object literal

var dog = {

	breed: 'Bulldog', // object literal property

	bark: function() { // object literal method

		console.log("Woof!");

	},

};

// using the object

console.log( dog.breed ); // output Bulldog

dog.bark(); // output Woof!
ログイン後にコピー

これは前の名前空間と非常によく似ていますが、実際にはそうではありません。偶然ではありません。リテラル オブジェクトの最も一般的な使用法は、グローバル スコープ内の変数またはオブジェクトとの競合を避けるために、カプセル化されたパッケージにコードをカプセル化することです。同様の理由で、構成パラメータをプラグインやオブジェクトに渡すためにもよく使用されます。

デザイン パターン に精通している方なら、オブジェクト リテラルはある程度シングルトン、つまりインスタンスが 1 つだけあるパターンであることがわかります。オブジェクト リテラルには本質的にインスタンス化および継承する機能がありません。次に、JavaScript でカスタム オブジェクトを作成する別の方法について学ぶ必要があります。

Constructor

コンストラクターを定義する

関数は JavaScript の第一級市民であり、他のエンティティによってサポートされるすべての操作関数がサポートされることを意味します。 JavaScript の世界では、関数を実行時に動的に構築したり、パラメーターとして使用したり、他の関数の戻り値として使用したり、変数に代入したりすることができます。さらに、関数は独自のプロパティやメソッドを持つこともできます。 JavaScript の関数の性質により、関数はインスタンス化および継承できるものになります。

コンストラクターを使用してカスタム オブジェクトを作成する方法を見てみましょう:

// creating a function

function Person( name, email ) {

	// declaring properties and methods using the (this) keyword

	this.name 	= name;
	this.email 	= email;

	this.sayHey = function() {

		console.log( "Hey, I’m " + this.name );

	};

}

// instantiating an object using the (new) keyword

var steve = new Person( "Steve", "steve@hotmail.com" );

// accessing methods and properties

steve.sayHey();
ログイン後にコピー

创建构造函数类似于创建普通函数,只有一点例外:用 this 关键字定义自发性和方法。一旦函数被创建,就可以用 new 关键字来生成实例并赋予变量。每次使用 new 关键字,this 都指向一个新的实例。

构建函数实例化和传统面向对象编程语言中的通过类实例化并非完全不同,但是,这里存在一个可能不易被察觉的问题。

当使用 new 关键字创建新对象的时候,函数块会被反复执行,这使得每次运行都会产生新的匿名函数来定义方法。这就像创建新的对象一样,会导致程序消耗更多内存。这个问题在现代浏览器上运行的程序中并不显眼。但随着应用规则地扩大,在旧一点的浏览器、计算机或者低电耗设备中就会出现性能问题。不过不用担心,有更好的办法将方法附加给构造函数(是不会污染全局环境的哦)。

方法和原型

前面介绍中提到 JavaScript 是一种基于原型的编程语言。在 JavaScript 中,可以把原型当作对象模板一样来使用。原型能避免在实例化对象时创建多余的匿名函数和变量。

在 JavaScript 中,prototype 是一个非常特别的属性,可以让我们为对象添加新的属性和方法。现在用原型重写上面的示例看看:

// creating a function

function Person( name, email ) {

	// declaring properties and methods using the (this) keyword

	this.name 	= name;
	this.email 	= email;

}

// assign a new method to the object’s prototype

Person.prototype.sayHey = function() {

	console.log( "Hey, I’m " + this.name );

}

// instantiating a new object using the constructor function

var steve = new Person( "Steve", "steve@hotmail.com" );

// accessing methods and properties

steve.sayHey();
ログイン後にコピー

这个示例中,不再为每个 Person 实例定义 sayHey 方法,而是通过原型模板在各实例中共享这个方法。

继承性

通过原型链,原型可以用来实例继承。JavaScript 的每一个对象都有原型,而原型是另外一个对象,也有它自己的原型,周而复始…直到某个原型对象的原型是 null——原型链到此为止。

在访问一个方法或属性的时候,JavaScript 首先检查它们是否在对象中定义,如果不,则检查是否定义在原型中。如果在原型中也没找到,则会延着原型链一直找下去,直到找到,或者到达原型链的终端。

现在来看看代码是怎么实现的。可以从上一个示例中的 Person 对象开始,另外再创建一个叫 Employee 的对象。

// Our person object

function Person( name, email ) {

	this.name 	= name;
	this.email 	= email;

}

Person.prototype.sayHey = function() {

	console.log( "Hey, I’m " + this.name );

}

// A new employee object

function Employee( jobTitle ) {

	this.jobTitle = jobTitle;

}
ログイン後にコピー

现在 Employee 只有一个属性。不过既然员工也属于人,我们希望它能从 Person 继承其它属性。要达到这个目的,我们可以在 Employee 对象中调用 Person 的构造函数,并配置原型链。

// Our person object

function Person( name, email ) {

	this.name 	= name;
	this.email 	= email;

}

Person.prototype.sayHey = function() {

	console.log( "Hey, I’m " + this.name );

}

// A new employee object

function Employee( name, email, jobTitle ) {

	// The call function is calling the Constructor of Person
	// and decorates Employee with the same properties

	Person.call( this, name, email );

	this.jobTitle = jobTitle;

}

// To set up the prototype chain, we create a new object using 
// the Person prototype and assign it to the Employee prototype

Employee.prototype = Object.create( Person.prototype );

// Now we can access Person properties and methods through the
// Employee object

var matthew = new Employee( "Matthew", "matthew@hotmail.com", "Developer" );

matthew.sayHey();
ログイン後にコピー

要适应原型继承还需要一些时间,但是这一个必须熟悉的重要概念。虽然原型继承模型常常被认为是 JavaScript 的弱点,但实际上它比传统模型更强大。比如说,在掌握了原型模型之后创建传统模型简直就太容易了。

ECMAScript 6 引入了一组新的关键字用于实现 类。虽然新的设计看起来与传统基于类的开发语言非常接近,但它们并不相同。JavaScript 仍然基于原型。

以上就是JavaScript 中的面向对象编程的详细介绍的内容,更多相关内容请关注PHP中文网(www.php.cn)!

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホット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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 Dec 17, 2023 pm 02:54 PM

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 はじめに: 技術の継続的な発展により、音声認識技術は人工知能の分野の重要な部分になりました。 WebSocket と JavaScript をベースとしたオンライン音声認識システムは、低遅延、リアルタイム、クロスプラットフォームという特徴があり、広く使用されるソリューションとなっています。この記事では、WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法を紹介します。

WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー Dec 17, 2023 pm 05:30 PM

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 Dec 17, 2023 pm 12:09 PM

JavaScript と WebSocket を使用してリアルタイム オンライン注文システムを実装する方法の紹介: インターネットの普及とテクノロジーの進歩に伴い、ますます多くのレストランがオンライン注文サービスを提供し始めています。リアルタイムのオンライン注文システムを実装するには、JavaScript と WebSocket テクノロジを使用できます。 WebSocket は、TCP プロトコルをベースとした全二重通信プロトコルで、クライアントとサーバー間のリアルタイム双方向通信を実現します。リアルタイムオンラインオーダーシステムにおいて、ユーザーが料理を選択して注文するとき

WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 Dec 17, 2023 am 09:39 AM

WebSocket と JavaScript を使用してオンライン予約システムを実装する方法 今日のデジタル時代では、ますます多くの企業やサービスがオンライン予約機能を提供する必要があります。効率的かつリアルタイムのオンライン予約システムを実装することが重要です。この記事では、WebSocket と JavaScript を使用してオンライン予約システムを実装する方法と、具体的なコード例を紹介します。 1. WebSocket とは何ですか? WebSocket は、単一の TCP 接続における全二重方式です。

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 Dec 17, 2023 pm 05:13 PM

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を学びます。この記事では、具体的なコード例を通じて実装プロセスを説明します。私たちは

簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 Jan 05, 2024 pm 06:08 PM

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

JavaScriptでinsertBeforeを使用する方法 JavaScriptでinsertBeforeを使用する方法 Nov 24, 2023 am 11:56 AM

使用法: JavaScript では、insertBefore() メソッドを使用して、DOM ツリーに新しいノードを挿入します。このメソッドには、挿入される新しいノードと参照ノード (つまり、新しいノードが挿入されるノード) の 2 つのパラメータが必要です。

JavaScript で HTTP ステータス コードを簡単に取得する方法 JavaScript で HTTP ステータス コードを簡単に取得する方法 Jan 05, 2024 pm 01:37 PM

JavaScript で HTTP ステータス コードを取得する方法の紹介: フロントエンド開発では、バックエンド インターフェイスとの対話を処理する必要があることが多く、HTTP ステータス コードはその非常に重要な部分です。 HTTP ステータス コードを理解して取得すると、インターフェイスから返されたデータをより適切に処理できるようになります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法と、具体的なコード例を紹介します。 1. HTTP ステータス コードとは何ですか? HTTP ステータス コードとは、ブラウザがサーバーへのリクエストを開始したときに、サービスが

See all articles