文書の過去の版を表示しています。
— y2sunlight 2020-10-28
JavaScriptでは関数オブジェクトがクラスの役割を果たします。以下の例の様に、関数リテラルを使ってクラスを記述することができます。
var Student = function(name) { // コンストラクタ this.name = name; // プロパティ this.greeting = function() { // メソッド console.log(`I am ${this.name}`); }; }; var suzuki = new Student('suzuki');
this.プロパティ名
でプロパティを定義する。この例と同様に、次の様に名前付きの関数定義によってクラスを記述することができます。
function Student(name) { // コンストラクタ this.name = name; // プロパティ this.greeting = function() { // メソッド console.log(`I am ${this.name}`); }; }; var suzuki = new Student('suzuki');
var 変数名 = new オブジェクト名([引数, ・・・])
this.プロパティ名
var name = suzuki.name(); // プロパティの読み込み suzuki.name = 'suzuki taro'; // プロパティの書き込み suzuki.greeting(); // メソッドの呼び出し
静的プロパティ(またはメソッド)は、インスタンスを生成しなくてもオブジェクトから直接呼び出すことができるプロパティ(またはメソッド)です。これは以下の様に定義することができます。
オブジェクト名.プロパティ名 = 値; オブジェクト名.メソッド名 = function() {/* メソッドの定義 */};
var Student = function(name) { this.name = name; // インスタンスプロパティ this.greeting = function() { // インスタンスメソッド console.log(`I am ${this.name}.`); }; } Student.age = 15; // 静的プロパティ Student.getSchoolName = function() { // 静的メソッド return 'AbcSchool'; } console.log(Student.age); // OK (15) console.log(Student.getSchoolName()); // OK (AbcSchool)
静的プロパティ(またはメソッド)は、インスタンスからアクセスすることはできません。
var taro = new Student('taro'); taro.name = 'suzuki taro' // OK taro.greeting(); // OK (I am suzuki taro.) console.log(taro.age); // NG (undefined) console.log(taro.getSchoolName()); // NG (taro.getSchoolName is not a function)
JavaScriptでは他のオブジェクト指向言語と異なり、プライベートメンバを定義する構文がありません。その代わりにクロージャを使用します。
function Circle(radius) { var _radius; // プライベートメソッド(クロージャ) var _area = function() { return _radius * _radius * Math.PI; }; // パブリックメソッド this.setRadius = function(radius) { // プライベートプロパティに設定 _radius = radius }; // パブリックメソッド this.getRadius = function() { // プライベートプロパティから取得 return _radius; }; // パブリックメソッド this.getArea = function() { // プライベートメソッドにアクセス return _area(); }; this.setRadius(radius); } var a = new Circle(10); console.log(a.getRadius()); // 結果:10 console.log(a.getArea()); // 結果:314.1592653589793
特権メソッドとは、クラスのプライベートメンバにアクセスできるメソッド(クロージャ)の事です。特権メソッド自体はクラス内のパブリックメンバや他のインスタンスからアクセス出来るので、内部のプライベートメンバと外部との橋渡し的存在となります。
特権メソッドはアクセッサ―と呼ばれることがあり、プライベートメンバを取得するゲッターメソッドと、設定するセッターメソッドに分かれます。上例では setRadius()
や getRadius()
がアクセッサーになります。
上例の様にクロージャ(特権メソッド)を使用して、アクセッサを実装する代わりに、Object.definePropertyメソッドを利用してアクセッサメソッドを実装することもできます。
function Circle(radius) { var _radius; // プライベートメソッド(クロージャ) var _area = function() { return _radius * _radius * Math.PI; }; Object.defineProperty( this, 'radius', { get: function(){ return _radius; }, set: function(radius){ _radius = radius; } } ); Object.defineProperty( this, 'area', { get: function(){ return _area(); } } ); this.radius = radius; } var a = new Circle(10); console.log(a.radius); // 結果:10 console.log(a.area); // 結果:314.1592653589793
詳しくはこちらを参照してください。
オブジェクト | 説明 | |
---|---|---|
Global | JavaScriptの基本機能 | |
参照型 | Object | ラッパーオブジェクト JavaScriptの標準なデータ型(基本型、参照型)をラップしたもの |
Array | ||
Function | ||
基本型 | String | |
Boolean | ||
Number | ||
Symbol | ||
Math | 数値演算 | |
Date | 日付 | |
RegExp | 正規表現 | |
Error/XxxxError | エラー | |
Map/WeakMap*2015 | ディクショナリー | |
Set/WeakSet*2015 | 集合(セット) | |
Proxy*2015 | オブジェクトの基本動作のカスタマイズ | |
Promise*2015 | 非同期処理 |
var str = 'こんにちは'; // 基本型のプロパティにアクセスすると一時的にオブジェクトが作られる // str.length => (new String(str)).length console.log(str.length);
// 基本型 var flag = false; if(flag){ // ここには来ない } // 参照型 var flag = new Boolean(false); if(flag){ // ここには来る } if(flag.valueOf()){ // 正解の書き方 // ここには来ない }