同時に、高級オブジェクト指向言語では、プライベート メンバーを含むオブジェクトの作成が最も基本的な機能の 1 つであり、プライベート メンバーにアクセスするためのプロパティとメソッドを提供することで内部の詳細が隠蔽されることもわかっています。 JS もオブジェクト指向ですが、メンバーがパブリックかプライベートかを直接示す内部メカニズムはありません。繰り返しますが、JS の言語の柔軟性を利用して、パブリック、プライベート、および特権メンバーを作成できます。情報の隠蔽が私たちが達成したい目標であり、カプセル化はこの目標を達成する方法です。例で説明しましょう。書籍データを保存し、そのデータを Web ページに表示するクラスを作成します。
1. 最も簡単なのは、オブジェクトを完全に公開することです。コンストラクターを使用して、すべてのプロパティとメソッドが外部からアクセスできるクラスを作成します。
var Book = function(isbn, title,著者) {
if(isbn == unknown) {
throw new Error("Book コンストラクターには isbn が必要です。")
}
this.isbn =
this.title; = タイトル | "";
this.author = 著者 ""
Book.prototype.display = function() {
return "書籍: " ",Title : " this.title ",Author: " this.author;
}
if(!this.checkIsbn(isbn)) {
throw new Error("書籍: ISBN が無効です。")
}
this.isbn =
this; .title = タイトル || "";
this.author = 著者 || ""
book.prototype = {
checkIsbn: function(isbn) == 未定義 || isbn のタイプ != "string") return false;
isbn = isbn.replace("-", ""); 13) false を返します;
var sum == 10) {
if(!isbn.match(^d{9}))
を返します。 (var i = 0;i sum = isn.charAt(i) * (10 - i)
}
var checksum = sum % 11; (チェックサム = = 10) チェックサム = "X";
if(isbn.charAt(9) != チェックサム) return false;
} else {
if(!isbn.match(^d{12) })) false を返します;
for(var i = 0;i sum =isbn.charAt(i) * (i % 2 == 0 ? 1 : 3); 🎜>}
var checksum = sum % 10;
if(isbn.charAt(12) != checksum) return false;
}
return
},
display; : function( ) {
return "書籍: ISBN: " this.isbn ",タイトル: " this.title ",著者: " this.author;
;
ISBN の有効性を検証し、display() が正常に動作できることを確認するために checkIsbn() を追加しました。ただし、要件は変更されており、各書籍に複数のバージョンがある可能性があります。つまり、同じ書籍に複数の ISBN 番号がある可能性があり、制御のためにバージョンを選択するための別のアルゴリズムを維持する必要があります。同時に、データの整合性はチェックできますが、内部メンバーへの外部アクセスを制御できないため(isbn、タイトル、著者に値を割り当てるなど)、内部データを保護する方法はありません。私たちはこのソリューションを改善し続け、インターフェイス実装 (get アクセサー/セット メモリを提供する) を採用します。
コードをコピー
var Publication = new Interface("Publication", ["getIsbn", "setIsbn", "checkIsbn", "getTitle", "setTitle", "getAuthor", "setAuthor", "display"]) ;
var Book = function(isbn, title, author) {
// Publication インターフェイスを実装します
this.setIsbn(isbn);
this.setTitle(タイトル);
this.setAuthor(著者);
}
Book.prototype = {
getIsbn: function() {
return this.isbn;
},
setIsbn: function(isbn) {
if(!this.checkIsbn(isbn)) {
throw new Error("書籍: 無効な ISBN。");
}
this.isbn = isb;
},
checkIsbn: function(isbn) {
if(isbn == 未定義 || typeof isbn != "string") return false;
isbn = isbn.replace("-", "");
if(isbn.length != 10 &&isbn.length != 13) は false を返します。
変数合計 = 0;
if(isbn.length == 10) {
if(!isbn.match(^d{9})) false を返します。
for(var i = 0;i sum =isbn.charAt(i) * (10 - i);
}
var checksum = sum % 11;
if(チェックサム == 10) チェックサム = "X";
if(isbn.charAt(9) != チェックサム) false を返します。
} else {
if(!isbn.match(^d{12})) return false;
for(var i = 0;i sum = isbn.charAt(i) * (i % 2 == 0 ? 1 : 3);
}
var checksum = sum % 10;
if(isbn.charAt(12) != チェックサム) false を返します。
}
true を返します。
},
getTitle: function() {
return this.title;
},
setTitle: function(title) {
this.title = title || "";
},
getAuthor: function() {
return this.author;
},
setAuthor: function(author) {
this.author = 著者 || "";
},
display: function() {
return "書籍: ISBN: " this.isbn ",タイトル: " this.title ",著者: " this.author;
}
};
この方法は、同様のテストを 2 回実行する必要がなく、完全な完全なエクスポーズ オブジェクト スキームと同様に、アーキテクチャの内部でも実行されます。この方法は、メモリを設定することによって設定することができるが、公開されており、値を直接評価することもできる。
2. 唯一の欠点は、内部データを保護できず、余分なコードが追加されることです。 命名規則の私的方法を使用する。つまり、下位ラインを使用して私が所有者であることを認識し、私が所有者に評価値を適用することを回避し、本質的には完全な暴露対象を回避する。
var Publication = new Interface("Publication", ["getIsbn", "setIsbn", "getTitle" 、「setTitle」、「getAuthor」、「setAuthor」、「display」]);
var Book = function(isbn, title, author) {
// Publication インターフェイスを実装します
this.setIsbn(isbn);
this.setTitle(タイトル);
this.setAuthor(著者);
}
Book.prototype = {
getIsbn: function() {
return this._isbn;
},
setIsbn: function(isbn) {
if(!this._checkIsbn(isbn)) {
throw new Error("書籍: 無効な ISBN。");
}
this._isbn = isbn;
},
_checkIsbn: function(isbn) {
if(isbn == 未定義 || typeof isbn != "string") return false;
isbn = isbn.replace("-", "");
if(isbn.length != 10 &&isbn.length != 13) は false を返します。
変数合計 = 0;
if(isbn.length == 10) {
if(!isbn.match(^d{9})) return false;
for(var i = 0;i sum =isbn.charAt(i) * (10 - i);
}
var checksum = sum % 11;
if(チェックサム == 10) チェックサム = "X";
if(isbn.charAt(9) != チェックサム) false を返します。
} else {
if(!isbn.match(^d{12})) return false;
for(var i = 0;i sum = isbn.charAt(i) * (i % 2 == 0 ? 1 : 3);
}
var checksum = sum % 10;
if(isbn.charAt(12) != チェックサム) false を返します。
}
true を返します。
},
getTitle: function() {
return this._title;
},
setTitle: function(title) {
this._title = title || "";
},
getAuthor: function() {
return this._author;
},
setAuthor: function(author) {
this._author = 著者 || "";
},
display: function() {
return "書籍: ISBN: " this.getIsbn() ",タイトル: " this.getTitle() ",著者: " this.getAuthor();
}
};
注: 「_」でプライベート メンバーとしてマークされるisbn、title、author属性に加えて、checkIsbn() もプライベート メソッドとしてマークされます。
3. クロージャを通じてメンバーを本当に私物化する。クロージャの概念におけるスコープとネストされた関数に詳しくない場合は、ここでは詳しく説明しませんが、記事「オブジェクト指向 Javascript の 1 つ (初めての Javascript 入門)」を参照してください。
var Publication = new Interface("Publication" , [" getIsbn", "setIsbn", "getTitle", "setTitle", "getAuthor", "setAuthor", "display"]);
var Book = function(newIsbn, newTitle, newAuthor) {
// プライベート属性
var isbn, title, author;
// プライベート メソッド
function checkIsbn(isbn) {
if(isbn == unknown || typeof isbn != "string") return false;
isbn = isbn.replace("-", "");
if(isbn.length != 10 &&isbn.length != 13) return false; 🎜>if (isbn.length == 10) {
if(!isbn.match(^d{9})) return false;
for(var i = 0;i sum = isn.charAt(i) * (10 - i);
}
var checksum = sum % 11;
if(checksum == 10) checksum = "X"; >if(isbn.charAt(9) != チェックサム) return false;
} else {
if(!isbn.match(^d{12})) return false; 0;i sum = isn.charAt(i) * (i % 2 == 0 ? 1 : 3);
var checksum = sum % 10; 🎜>if (isbn.charAt(12) != checksum) return false;
}
return true;
}
// 特権メソッド
this.getIsbn = function() {
return
};
this.setIsbn = function(newIsbn) {
if(!checkIsbn(newIsbn)) {
throw new Error("書籍: 無効な ISBN。");
}
isbn = newIsbn;
}
this.getTitle = function() {
タイトルを返す;
},
this.setTitle = function(newTitle) {
title = newTitle || "";
},
this.getAuthor: function() {
著者を返す;
},
this.setAuthor: function(newAuthor) {
author = newAuthor || "";
}
// 出版物インターフェース
this.setTitle(newTitle); );
}
// public メソッド
Book.prototype = {
display: function() {
return "書籍: ISBN: " this.getIsbn() ",Title: " this.getTitle () ",Author: " this.getAuthor();
}
};
このソリューションと前のソリューションの違いは何ですか?まず、コンストラクター内で var を使用して 3 つのプライベート メンバーを宣言し、コンストラクター内でのみ有効なプライベート メソッド checkIsbn() も宣言します。 this キーワードを使用して特権メソッドを宣言します。つまり、コンストラクター内で宣言されますが、プライベート メンバーにアクセスできます。プライベート メンバーにアクセスする必要のないメソッドはすべて Book.prototype で宣言されます (display など)。つまり、プライベート メンバーにアクセスする必要があるメソッドを特権メソッドとして宣言することが、この問題を解決する鍵となります。ただし、このアクセスにはいくつかの欠点もあります。たとえば、インスタンスごとに特権メソッドのコピーを作成する必要があり、必然的により多くのメモリが必要になります。私たちは、直面している問題を解決するために静的メンバーの最適化と使用を続けています。ちなみに、静的メンバーはクラスにのみ属し、すべてのオブジェクトは 1 つのコピーのみを共有します (「オブジェクト指向 Javascript 2 (インターフェイスの実装)」で説明されています。「Interface.ensureImplements メソッド」を参照)。一方、インスタンス メソッドは Word オブジェクト用です。
コードをコピー
コードは次のとおりです:
var Publication = new Interface("Publication", ["getIsbn", "setIsbn", "getTitle", "setTitle", "getAuthor", "setAuthor", "display"]);
var Book = (function() {
// プライベート静的属性
var numsOfBooks = 0;
// プライベート静的メソッド
function checkIsbn(isbn) {
if(isbn == 未定義 || isbn のタイプ != "string") return false;
isbn = isbn.replace("-", ""); 13) false を返します;
var sum == 10) {
if(!isbn.match(^d{9}))
を返します。 (var i = 0;i sum = isn.charAt(i) * (10 - i)
}
var checksum = sum % 11; (チェックサム == 10) チェックサム = "X";
if(isbn.charAt(9) != チェックサム) return false;
} else {
if(!isbn.match(^d{12) })) false を返します;
for(var i = 0;i sum =isbn.charAt(i) * (i % 2 == 0 ? 1 : 3); 🎜>}
var checksum = sum % 10;
if(isbn.charAt(12) != checksum) return false;
}
return
}
// return コンストラクター
return function(newIsbn, newTitle, newAuthor) {
// プライベート属性
var isbn, title, author;
// 特権メソッド
this.getIsbn = function() {
isbn を返す;
};
this.setIsbn = function(newIsbn) {
if(!Book.checkIsbn(newIsbn)) {
throw new Error("書籍: 無効な ISBN。");
}
isbn = newIsbn;
}
this.getTitle = function() {
タイトルを返す;
},
this.setTitle = function(newTitle) {
title = newTitle || "";
},
this.getAuthor = function() {
著者を返す;
},
this.setAuthor = function(newAuthor) {
author = newAuthor || "";
}
Book.numsOfBooks ;
if(Book.numsOfBooks > 50) {
throw new Error("Book: Book のインスタンスは最大 50 個作成できます。");
}
// Publication インターフェース
this.setIsbn(newIsbn); を実装します。
this.setTitle(newTitle);
this.setAuthor(newAuthor);
};
})();
// public static メソッド
Book.convertToTitle = function(title) {
return title.toUpperCase();
}
// public メソッド
Book.prototype = {
display: function() {
return "Book: ISBN: " this.getIsbn() ",Title: " this. getTitle() ",Author: " this.getAuthor();
}
};
この方法は上記と同様に、var と this を使用して静的メソッドを構築することと、checkIsbn を私的静的メソッドとして指定する点が異なります。必要に応じて、私たちがすべてのオブジェクトを公開する 1 つの関数をサブ本にするという解決策を考えています。ここで私たちは 1 つの問題を検討し、>の最大印刷量が 500 であるなど、さまざまな制限を設ける必要があると考えています。 > 最大印刷量は 1000 であり、つまり、最大印刷量の定期的な量が必要です。
暗号化

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

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

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

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

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

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

Python作为一种高级编程语言,在众多编程语言中占有举足轻重的地位。它的语法简单易学,拥有各种强大的编程库,被广泛应用于数据处理、机器学习、网络编程等领域。而其中最重要的一点便是Python完美支持面向对象编程,本文将重点阐述Python中的面向对象编程。一、面向对象编程的基本概念在面向对象的编程语言中,数据和方法被封装在对象的内部。这使得对象能够独立地进

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


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

Dreamweaver Mac版
ビジュアル Web 開発ツール

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

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

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。
