検索
ホームページウェブフロントエンドjsチュートリアル保守可能なオブジェクト指向 JavaScript コードの作成 [翻訳]_js オブジェクト指向

保守可能なオブジェクト指向 (OO) JavaScript を作成すると、コストが節約され、人気が高まります。信じられない?おそらく、あなたか他の誰かが戻ってきて、あなたのコードを扱うことになるでしょう。それをできるだけ苦痛のない経験にすれば、時間の節約につながり、それがお金に相当することは誰もが知っています。また、あなたが頭痛の種をなくしてくれた人々の好意も得るでしょう。ただし、保守可能な OO JavaScript の作成に入る前に、OO とは何なのかを簡単に見てみましょう。 OO についてすでに知っている場合は、次のセクションを飛ばしてください。

OO とは何ですか?
オブジェクト指向プログラミングは基本的に、コード内で操作する物理的な現実世界のオブジェクトを表します。オブジェクトを作成するには、まずクラスと呼ばれるものを記述してオブジェクトを定義する必要があります。クラスは、アカウント、従業員、ナビゲーション メニュー、車両、植物、広告、飲み物など、ほとんどすべてのものを表すことができます。その後、操作するオブジェクトを作成するたびに、クラスからオブジェクトをインスタンス化します。言い換えれば、操作するオブジェクトを提供するクラスのインスタンスを作成します。実際、オブジェクトを使用するのに最適な時期は、複数のオブジェクトを扱うときです。それ以外の場合は、単純な関数型プログラムでも同様に機能する可能性があります。オブジェクトは本質的にはデータのコンテナです。したがって、従業員オブジェクトの場合は、従業員番号、名前、開始日、役職、給与、年功序列などを保存できます。オブジェクトには、そのデータを処理する関数 (メソッドと呼ばれる) も含まれています。データの整合性を確保するための仲介手段としてメソッドが使用されます。データを保存する前に変換するためにも使用されます。たとえば、メソッドは任意の形式で日付を受け取り、それを標準化された形式に変換してから保存できます。最後に、クラスは他のクラスから継承することもできます。継承により、さまざまな種類のクラス間でコードを再利用できます。たとえば、銀行口座とビデオ ストアの口座クラスはどちらも、プロフィール情報、口座作成日、支店情報などのフィールドを提供する基本口座クラスから継承できます。その後、それぞれが独自のトランザクションまたはレンタル処理データ構造を定義します。と方法。

警告: JavaScript OO は異なります
前のセクションでは、古典的なオブジェクト指向プログラミングの基本について概説しました。私が古典的と言ったのは、JavaScript がこれらのルールに完全に従っていないからです。代わりに、JavaScript クラスは実際には関数として記述され、継承はプロトタイプです。プロトタイプ継承は基本的に、クラスがクラスから継承するのではなく、プロトタイプ プロパティを使用してオブジェクトから継承することを意味します。

オブジェクトのインスタンス化
JavaScript でのオブジェクトのインスタンス化の例を次に示します:

复制代 代码如下:

// Employee クラスを定義します。
function Employee(num, fname, lname) {
this.getFullName = function () {
return fname " " l 名前;
}
};
// Employee オブジェクトをインスタンス化します
var john = new Employee("4815162342", "John", "Doe");
alert("従業員のフルネームは " john.getFullName());

ここで注意すべき重要な点が 3 つあります:

「class」関数の最初の文字を大文字にしました。この重要な違いにより、これがインスタンス化のためのものであり、通常の関数として呼び出されるものではないことがわかります。
インスタンス化するときに new 演算子を使用します。これを省略すると、単に関数が呼び出され、問題が発生します。
getFullName は this 演算子に割り当てられているため公開されていますが、fname と lname は公開されていません。 Employee 関数によって作成されたクロージャは、getFullName に fname と lname へのアクセスを与え、同時に他のユーザーからは非公開のままにすることができます。
プロトタイプの継承
ここで、JavaScript でのプロトタイプの継承の例を示します。 >
// Human クラスを定義します。 function Human() { this.setName = function (fname, lname) { this.fname = fname; this.lname = lname; } this.getFullName = function () {
return this.fname " " this.lname;

}
}

// Employee クラスを定義します。
function Employee(num) {
this.getNum = function () {
return num;
}
};
// Employee を Human から継承させます
Employee.prototype = new Human();

// Employee オブジェクトをインスタンス化します
var john = new Employee("4815162342");
john.setName("ジョン", "ドウ");
alert(john.getFullName() " の従業員番号は " john.getNum());


今回は、人間に共通のプロパティを含む Human クラスを作成しました。従業員だけでなくすべての人間には名前があるため、fname と lname をそこに移動しました。次に、Human オブジェクトをそのプロトタイプ プロパティに割り当てて、Employee クラスを拡張しました。

継承によるコードの再利用
前の例では、元の Employee クラスを 2 つに分割しました。すべての人間に共通するすべてのプロパティを Human クラスに移動し、Employee に Human を継承させました。そうすることで、Human にレイアウトされたプロパティを Student、Client、Citizen、Visitor などの他のオブジェクトで使用できるようになります。もうお気づきかもしれませんが、これはコードを分割して再利用するための優れた方法です。人間を扱う場合、単一タイプのオブジェクトごとにこれらのプロパティをすべて再作成するのではなく、Human から継承することですでに利用可能なものを使用することができます。さらに、ミドルネームなどのプロパティを追加したい場合は、一度実行すれば、Human から継承するすべてのユーザーがすぐに使用できるようになります。逆に、ミドル ネーム プロパティを 1 つのオブジェクトだけに追加したい場合は、Human に追加する代わりに、そのオブジェクト内で直接実行できます。

パブリックとプライベート
クラスのパブリック変数とプライベート変数について触れたいと思います。オブジェクト内のデータをどのように扱うかに応じて、データをプライベートまたはパブリックにする必要があります。私有地だからといって、人々がアクセスできないわけではありません。最初にいずれかの方法を実行してもらいたいだけかもしれません。

読み取り専用
オブジェクトの作成時に値を 1 回だけ定義したい場合があります。一度作成した値は、誰にも変更されることは望ましくありません。これを行うには、プライベート変数を作成し、インスタンス化時にその値を設定します。

复制代码代码如下:

function Animal(type) {
変数データ = [];
data['type'] = タイプ;
this.getType = function () {
return data['type'];
}
}

varふわふわ = new Animal('犬');
fluffy.getType(); // 'dog' を返します

この例では、Animal クラス内に data というローカル配列を作成します。 Animal オブジェクトがインスタンス化されると、type の値が渡され、データ配列に設定されます。この値はプライベートであるため上書きできません (Animal 関数がそのスコープを定義します)。オブジェクトがインスタンス化された後に型値を読み取る唯一の方法は、明示的に公開した getType メソッドを呼び出すことです。 getType は Animal 内で定義されているため、Animal によって作成されたクロージャによってデータにアクセスできます。このようにして、ユーザーはオブジェクトのタイプを読み取ることはできますが、変更することはできません。

オブジェクトが継承される場合、「読み取り専用」手法は機能しないことに注意することが重要です。継承の実行後にインスタンス化されたすべてのオブジェクトは、これらの読み取り専用変数を共有し、互いの値を上書きします。最も簡単な解決策は、クラス内の読み取り専用変数をパブリック変数に変換することです。ただし、それらを非公開にしなければならない場合は、フィリップがコメントで指摘したテクニックを使用できます。

パブリック
ただし、プロパティの値を自由に読み書きできるようにしたい場合があります。これを行うには、this 演算子を使用してプロパティを公開する必要があります。
复制代代码如下:

function Animal() {
this.mood = '';
}

varふわふわ = new Animal();
fluffy.mood = '幸せ';
ふわふわした気分; // 'happy' を返します

今回、Animal クラスは、自由に書き込んだり読み込んだりできる、mood という名前のプロパティを公開します。前の例の getType 関数と同様に、関数をパブリック プロパティに割り当てることができます。 getType などのプロパティに値を代入しないように注意してください。代入しないと、値とともにプロパティが破壊されてしまいます。

完全にプライベート
最後に、完全にプライベートなローカル変数が必要なシナリオに遭遇するかもしれません。この場合、最初の例と同じパターンを使用し、ユーザーがアクセスするためのパブリック メソッドを作成しないだけで済みます。
复制代代码如下:

function Animal() {
var Secret = "君には決して分からないよ!」
}
varふわふわ = new Animal();

柔軟な API の作成
クラスの作成について説明したので、製品要件の変更に対応するためにクラスの将来を保証する必要があります。プロジェクト作業を行ったり、製品を長期にわたって保守したりしたことがある場合は、要件が変化することをご存知でしょう。それは人生の事実です。そうでないと考えることは、コードが書かれる前にコードが陳腐化する運命にあるということです。突然、タブのコンテンツをアニメーション化したり、Ajax 呼び出しを介してデータを取得したりする必要がある場合があります。未来を正確に予測することは不可能ですが、十分に将来を見据えた柔軟なコードを記述することは可能です。

Saner パラメータ リスト
将来性を考慮して実行できる場所の 1 つは、パラメータ リストを設計するときです。これらはコードを実装する人々の主な連絡先であり、適切に設計されていないと問題が発生する可能性があります。避けたいのは、次のようなパラメーター リストです。
复制代 代码如下:

function人 (従業員 ID、fname、lname、電話番号、ファックス、電子メール、電子メール 2、生年月日) {
};

このクラスは非常に壊れやすいです。コードをリリースした後でミドルネームパラメータを追加したい場合は、順序が重要であるため、リストの最後に追加する必要があります。そのため、作業するのが面倒になります。また、各パラメーターの値がないと作業が困難になります。例:
复制代码代码如下:

var ara = new Person(1234, " Ara"、"ペリバニアン"、"514-555-1234"、null、null、null、"1976-05-17");

パラメータ リストにアプローチするよりクリーンで柔軟な方法は、次のパターンを使用することです:
复制代码 代コード如下:

function Person(employeeId, data) {
};

最初のパラメータは必須であるため存在します。残りは 1 つのオブジェクトにまとめられており、非常に柔軟に操作できます。
复制代代码如下:

var ara = new Person(1234, {
fname: "Ara"、
lname: "Pehlivanian"、
tel: "514-555-1234"、
生年月日: "1976-05-17"
});

このパターンの利点は、読みやすく、柔軟性が高いことです。 FAX、電子メール、電子メール 2 が完全に省略されていることに注目してください。また、オブジェクトは順序に固有ではないため、ミドルネームパラメータの追加は、都合の良い場所に放り込むだけで簡単です:
复制代码 代码如下:

var ara = new Person(1234, {
fname: "Ara",
mname: "Chris",
lname: "Pehlivanian",
電話番号: "514-555-1234"、
生年月日: "1976-05-17"
});

値は次のようにインデックスによってアクセスされるため、クラス内のコードは関係ありません。 >
代码如下:
function Person(employeeId, data) { this.fname = data['fname']; };
data['fname'] が値を返す場合、その値が設定されます。それ以外の場合は、何も壊れず、何も壊れません。

プラグイン可能にする
時間が経つにつれて、製品要件によりクラスに追加の動作が要求される場合があります。しかし、多くの場合、その動作はクラスのコア機能とはまったく関係がありません。また、あるタブのパネルのコンテンツをフェードインしながら別のタブの外部データをフェッチするなど、クラスの 1 つの実装のみに対する要件である可能性もあります。これらの能力を自分のクラスに取り入れたくなるかもしれませんが、そこには属しません。タブ ストリップの役割はタブを管理することです。アニメーションとデータの取得は完全に別のものであり、タブ ストリップのコードの外に置く必要があります。タブ ストリップを将来に備えて、余分な機能をすべて外部に保持する唯一の方法は、ユーザーがコードに動作をプラグインできるようにすることです。言い換えれば、onTabChange、afterTabChange、onShowPanel、afterShowPanel などのイベントを作成することで、ユーザーがコード内の重要な瞬間にフックできるようになります。そうすれば、onShowPanel イベントに簡単にフックして、そのパネルのコンテンツをフェードインするハンドラーを作成でき、誰もが満足できます。 JavaScript ライブラリを使用すると、これを簡単に行うことができますが、自分で解決するのはそれほど難しくありません。 YUI 3 を使用した簡単な例を次に示します。
复制代码 代码如下:





この例には、showPanel メソッドを備えた単純な TabStrip クラスがあります。このメソッドは、onShowPanel と afterShowPanel という 2 つのイベントを起動します。 Y.EventTarget でクラスを拡張することで、これを行う機能が与えられます。それが完了したら、TabStrip オブジェクトをインスタンス化し、それに一連のイベント ハンドラーを割り当てます。これは、実際のクラスをいじらずに、このインスタンスの固有の動作を処理するためのカスタム コードです。

概要

同じページ、Web サイト、または複数のプロジェクトでコードを再利用する予定がある場合は、コードをクラスにパッケージ化して編成することを検討してください。オブジェクト指向 JavaScript は、自然にコードの編成と再利用を改善します。さらに、少し事前に考えておけば、コードを作成した後も長期間使用し続けるのに十分な柔軟性を確保できます。再利用可能で将来性のある JavaScript を作成すると、あなた、あなたのチーム、会社の時間とお金を節約できます。そうすればきっと人気者になれますよ。
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
如何使用Go语言实现面向对象的事件驱动编程如何使用Go语言实现面向对象的事件驱动编程Jul 20, 2023 pm 10:36 PM

如何使用Go语言实现面向对象的事件驱动编程引言:面向对象的编程范式被广泛应用于软件开发中,而事件驱动编程是一种常见的编程模式,它通过事件的触发和处理来实现程序的流程控制。本文将介绍如何使用Go语言实现面向对象的事件驱动编程,并提供代码示例。一、事件驱动编程的概念事件驱动编程是一种基于事件和消息的编程模式,它将程序的流程控制转移到事件的触发和处理上。在事件驱动

解析PHP面向对象编程中的享元模式解析PHP面向对象编程中的享元模式Aug 14, 2023 pm 05:25 PM

解析PHP面向对象编程中的享元模式在面向对象编程中,设计模式是一种常用的软件设计方法,它可以提高代码的可读性、可维护性和可扩展性。享元模式(Flyweightpattern)是设计模式中的一种,它通过共享对象来降低内存的开销。本文将探讨如何在PHP中使用享元模式来提高程序性能。什么是享元模式?享元模式是一种结构型设计模式,它的目的是在不同对象之间共享相同的

python是面向对象还是面向过程python是面向对象还是面向过程Jan 05, 2023 pm 04:54 PM

python是面向对象的。Python语言在设计之初,就定位为一门面向对象的编程语言,“Python中一切皆对象”就是对Pytho 这门编程语言的完美诠释。类和对象是Python的重要特征,相比其它面向对象语言,Python很容易就可以创建出一个类和对象;同时,Python也支持面向对象的三大特征:封装、继承和多态。

go语言是面向对象的吗go语言是面向对象的吗Mar 15, 2021 am 11:51 AM

go语言既不是面向对象,也不是面向过程,因为Golang并没有明显的倾向,而是更倾向于让编程者去考虑该怎么去用它,也许它的特色就是灵活,编程者可以用它实现面向对象,但它本身不支持面向对象的语义。

如何使用Go语言实现面向对象的数据库访问如何使用Go语言实现面向对象的数据库访问Jul 25, 2023 pm 01:22 PM

如何使用Go语言实现面向对象的数据库访问引言:随着互联网的发展,大量的数据需要被存储和访问,数据库成为了现代应用开发中的重要组成部分。而作为一门现代化、高效性能的编程语言,Go语言很适合用来处理数据库操作。而本文将重点讨论如何使用Go语言实现面向对象的数据库访问。一、数据库访问的基本概念在开始讨论如何使用Go语言实现面向对象的数据库访问之前,我们先来了解一下

面向对象是啥意思面向对象是啥意思Jul 17, 2023 pm 02:03 PM

面向对象是软件开发方法,一种编程范式。是一种将面向对象的思想应用于软件开发过程并指导开发活动的系统方法。这是一种基于“对象”概念的方法论。对象是由数据和允许的操作组成的包,它与目标实体有直接的对应关系。对象类定义了一组具有类似属性的对象。面向对象是基于对象的概念,以对象为中心,以类和继承为构建机制,认识、理解和描绘客观世界,设计和构建相应的软件系统。

PHP面向对象编程入门指南PHP面向对象编程入门指南Jun 11, 2023 am 09:45 AM

PHP作为一种广泛使用的编程语言,已成为构建动态网站和网络应用程序的首选语言之一。其中,面向对象编程(OOP)的概念和技术越来越受到开发者的欢迎和推崇。本篇文章将为读者提供PHP面向对象编程的入门指南,介绍OOP的基本概念,语法和应用。什么是面向对象编程(OOP)?面向对象编程(Object-OrientedProgramming,简称OOP),是一种编程

Go语言中的面向对象编程方法Go语言中的面向对象编程方法Jun 01, 2023 am 11:21 AM

随着计算机技术的不断进步,编程语言也在不断发展与更新,每一种新的编程语言都有其自己独特的特点和优势。其中,Go语言作为一种比较新的编程语言,已经逐渐受到了开发者们的关注和喜爱。其中,面向对象编程方法是Go语言编程的重要组成部分,下面我们就来一起了解一下Go语言中的面向对象编程方法。一、Go语言中的面向对象编程面向对象编程(OOP,Object-Oriente

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

AI Hentai Generator

AI Hentai Generator

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

ホットツール

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

MantisBT

MantisBT

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

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

メモ帳++7.3.1

メモ帳++7.3.1

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

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、