コンテンツにスキップ

JavaScript/Number/prototype/constructor

出典: フリー教科書『ウィキブックス(Wikibooks)』


Number.prototype.constructor は、ECMAScript における Number オブジェクトのプロトタイププロパティで、Number オブジェクトのインスタンスを生成した関数を参照します。デフォルトでは、Number.prototype.constructor プロパティは Number コンストラクタ自体を指します[1]

構文

[編集]
Number.prototype.constructor

[編集]

特性

[編集]

Number.prototype.constructor には、以下のような特性があります:

  • プロトタイププロパティ: このプロパティは Number.prototype オブジェクトに属し、すべての Number インスタンスから継承されます。
  • 参照のみ: constructor プロパティは通常、参照するためだけに使用され、直接呼び出すことは少ないです。
  • 変更可能: constructor プロパティは書き換え可能ですが、通常は変更しないことが推奨されます。
  • ECMAScript 1: このプロパティは ECMAScript 1 から存在しています。

[編集]

基本的な使用法

[編集]

以下のプログラムは、Number.prototype.constructor の基本的な使用法を示しています。

// Number インスタンスの constructor プロパティへのアクセスconstnum=newNumber(42);console.log(num.constructor===Number);// true// Number.prototype.constructor への直接アクセスconsole.log(Number.prototype.constructor===Number);// true// constructor を使用して新しい Number インスタンスを作成constnum1=newNumber(123);constnum2=newnum1.constructor(456);console.log(num2);// Number {456}console.log(typeofnum2);// objectconsole.log(num2instanceofNumber);// true

このプログラムでは、Number.prototype.constructorNumber コンストラクタを参照していることを確認し、その constructor プロパティを使用して新しい Number インスタンスを作成する例を示しています。

型の識別

[編集]

以下のプログラムは、Number.prototype.constructor を使用してオブジェクトの型を識別する例を示しています。

// constructor プロパティを使用した型の識別functionidentifyType(value){// プリミティブ値の場合はオブジェクトラッパーを作成constobj=Object(value);// constructor プロパティを取得constconstructor=obj.constructor;// constructor の名前を返すreturnconstructor.name;}// 様々な値の型を識別console.log(identifyType(42));// 'Number'console.log(identifyType(3.14));// 'Number'console.log(identifyType(newNumber(100)));// 'Number'console.log(identifyType('hello'));// 'String'console.log(identifyType(true));// 'Boolean'console.log(identifyType({}));// 'Object'console.log(identifyType([]));// 'Array'console.log(identifyType(newDate()));// 'Date'console.log(identifyType(/regex/));// 'RegExp'console.log(identifyType(function(){}));// 'Function'

このプログラムでは、Number.prototype.constructor を含むオブジェクトの constructor プロパティを使用して、変数の型を識別する関数の例を示しています。プリミティブ値に対しては、まず Object() コンストラクタでラップしてからコンストラクタにアクセスしています。

プロトタイプの継承

[編集]

以下のプログラムは、Number.prototype.constructor とプロトタイプ継承の関係を示しています。

// カスタムの Number 拡張クラスclassMyNumberextendsNumber{isPositive(){returnthis>0;}isNegative(){returnthis<0;}isZero(){returnthis==0;}}// MyNumber インスタンスの作成constmyNum=newMyNumber(42);console.log(myNum.valueOf());// 42console.log(myNum.isPositive());// true// constructor の確認console.log(myNum.constructor===MyNumber);// trueconsole.log(myNum.constructor===Number);// false// プロトタイプチェーンの確認console.log(myNuminstanceofMyNumber);// trueconsole.log(myNuminstanceofNumber);// true// constructor を使用して新しいインスタンスを作成constmyNum2=newmyNum.constructor(-10);console.log(myNum2.valueOf());// -10console.log(myNum2.isNegative());// true

このプログラムでは、Number クラスを拡張したカスタムクラスを作成し、そのインスタンスの constructor プロパティを確認しています。MyNumber クラスのインスタンスの constructor プロパティは MyNumber コンストラクタを参照し、このプロパティを使用して新しいインスタンスを作成できることを示しています。

実用的な例

[編集]

オブジェクトの複製

[編集]

以下のプログラムは、Number.prototype.constructor を使用してオブジェクトを複製する例を示しています。

// オブジェクトのコンストラクタを使用して複製を作成する関数functioncloneUsingConstructor(obj){// null または undefined の場合if(obj===null||obj===undefined){returnobj;}// プリミティブ値の場合はそのまま返すif(typeofobj!=='object'&&typeofobj!=='function'){returnobj;}try{// 元のオブジェクトと同じコンストラクタを使用して新しいインスタンスを作成constclone=newobj.constructor();// プロパティをコピーfor(constkeyinobj){if(Object.prototype.hasOwnProperty.call(obj,key)){clone[key]=obj[key];}}returnclone;}catch(e){// コンストラクタが使用できない場合は通常のオブジェクトを返すconsole.warn('コンストラクタを使用した複製に失敗しました:',e);returnObject.assign({},obj);}}// 使用例constnumObj=newNumber(100);numObj.custom='テスト';constnumClone=cloneUsingConstructor(numObj);console.log(numCloneinstanceofNumber);// trueconsole.log(numClone.valueOf());// 100console.log(numClone.custom);// 'テスト'// 他の型のオブジェクトでも機能するconstdateObj=newDate();constdateClone=cloneUsingConstructor(dateObj);console.log(dateCloneinstanceofDate);// trueconsole.log(dateClone.getTime()===dateObj.getTime());// true// プリミティブ値の場合console.log(cloneUsingConstructor(42));// 42console.log(cloneUsingConstructor('hello'));// 'hello'

このプログラムでは、オブジェクトの constructor プロパティを使用して、同じ型の新しいインスタンスを作成し、元のオブジェクトのプロパティをコピーする関数の例を示しています。これにより、Number オブジェクトを含む様々な型のオブジェクトを適切に複製できます。

動的なオブジェクト生成

[編集]

以下のプログラムは、型名から動的に新しいオブジェクトを生成する例を示しています。

// グローバルコンストラクタのマッピングconstconstructors={'Number':Number,'String':String,'Boolean':Boolean,'Array':Array,'Object':Object,'Date':Date,'RegExp':RegExp};// 型名と引数からオブジェクトを動的に生成する関数functioncreateObjectOfType(typeName,...args){// 指定された型名に対応するコンストラクタを取得constConstructor=constructors[typeName];if(!Constructor){thrownewError(`未知の型名です: ${typeName}`);}// コンストラクタを使用して新しいインスタンスを作成returnnewConstructor(...args);}// 使用例constdynamicNumber=createObjectOfType('Number',42);console.log(dynamicNumberinstanceofNumber);// trueconsole.log(dynamicNumber.valueOf());// 42constdynamicDate=createObjectOfType('Date',2023,0,1);// 2023年1月1日console.log(dynamicDateinstanceofDate);// trueconsole.log(dynamicDate.getFullYear());// 2023// テキストデータから動的にオブジェクトを生成functionparseDataToObject(data){const[typeName,...values]=data.split(':');constparsedValues=values.map(val=>{// 数値に変換可能な場合は変換constnumVal=Number(val);returnisNaN(numVal)?val:numVal;});returncreateObjectOfType(typeName,...parsedValues);}// データ文字列からオブジェクトを生成console.log(parseDataToObject('Number:123').valueOf());// 123console.log(parseDataToObject('String:Hello,World').valueOf());// 'Hello,World'console.log(parseDataToObject('Date:2023,5,15').toLocaleDateString());// '2023/6/15' (月は0から始まるため)

このプログラムでは、型名を指定して動的にオブジェクトを生成する関数の例を示しています。constructor プロパティと同様に、コンストラクタ関数を使用して新しいインスタンスを作成しています。また、テキストデータから型情報を解析し、適切な型のオブジェクトを生成する例も含まれています。

フォームデータのバリデーション

[編集]

以下のプログラムは、Number.prototype.constructor を使用してフォームデータのバリデーションを行う例を示しています。

// フォームフィールドのバリデーションクラスclassFormValidator{constructor(){this.validationRules={number:{constructor:Number,validate:(value)=>!isNaN(Number(value)),message:'数値を入力してください'},string:{constructor:String,validate:(value)=>typeofvalue==='string'&&value.trim()!=='',message:'文字列を入力してください'},boolean:{constructor:Boolean,validate:(value)=>typeofvalue==='boolean'||value==='true'||value==='false',message:'真偽値を入力してください'},date:{constructor:Date,validate:(value)=>{constdate=newDate(value);return!isNaN(date.getTime());},message:'有効な日付を入力してください'}};}// フィールドを検証してキャストするvalidateAndCast(fieldName,value,type){construle=this.validationRules[type];if(!rule){thrownewError(`未知の型です: ${type}`);}// バリデーションif(!rule.validate(value)){return{valid:false,fieldName,message:rule.message};}// 適切な型に変換letcastedValue;if(type==='boolean'){// 文字列 'true'/'false' を適切にキャストcastedValue=value===true||value==='true';}elseif(type==='number'){// 文字列を数値に変換castedValue=newrule.constructor(value).valueOf();}elseif(type==='date'){// 文字列を Date に変換castedValue=newrule.constructor(value);}else{// その他の型castedValue=newrule.constructor(value);}return{valid:true,fieldName,value:castedValue};}// フォームデータを検証して処理validateForm(formData){constresults={valid:true,fields:{},errors:[]};for(constfieldofformData){const{name,value,type}=field;constvalidationResult=this.validateAndCast(name,value,type);if(validationResult.valid){results.fields[name]=validationResult.value;}else{results.valid=false;results.errors.push({field:name,message:validationResult.message});}}returnresults;}}// 使用例constvalidator=newFormValidator();// フォームデータの例constformData=[{name:'age',value:'25',type:'number'},{name:'name',value:'John',type:'string'},{name:'isActive',value:'true',type:'boolean'},{name:'birthdate',value:'1998-05-12',type:'date'},{name:'invalidNumber',value:'abc',type:'number'}];constvalidationResults=validator.validateForm(formData);console.log('フォームは有効か:',validationResults.valid);// falseconsole.log('検証済みフィールド:',validationResults.fields);/*{ age: 25, name: 'John', isActive: true, birthdate: 1998-05-12T00:00:00.000Z}*/console.log('エラー:',validationResults.errors);/*[ { field: 'invalidNumber', message: '数値を入力してください' }]*/

このプログラムでは、各型のコンストラクタを使用してフォームデータを検証し、適切な JavaScript の型に変換する例を示しています。コンストラクタを利用することで、型に応じた適切な変換とバリデーションを行っています。

Number.prototype.constructor と他の Number プロパティの比較

[編集]

Number オブジェクトには、Number.prototype.constructor 以外にも様々なプロパティとメソッドがあります。以下はその比較です:

// Number オブジェクトのプロパティとメソッドの比較constnum=newNumber(123.456);// プロトタイププロパティの確認console.log('Number.prototype.constructor:',num.constructor===Number);// true// インスタンスメソッドconsole.log('toString():',num.toString());// '123.456'console.log('toString(16):',num.toString(16));// '7b.74bc6a7ef9db' (16進数)console.log('valueOf():',num.valueOf());// 123.456console.log('toFixed(2):',num.toFixed(2));// '123.46'console.log('toExponential(2):',num.toExponential(2));// '1.23e+2'console.log('toLocaleString():',num.toLocaleString());// '123.456' (ロケールに依存)// 静的メソッドとの比較console.log('Number.parseFloat("123.456"):',Number.parseFloat('123.456'));// 123.456console.log('Number.parseInt("123.456", 10):',Number.parseInt('123.456',10));// 123// constructor は直接呼び出し可能constnewNum=newnum.constructor(789);console.log('new num.constructor(789):',newNum.valueOf());// 789

このプログラムでは、Number.prototype.constructor と他の Number オブジェクトのプロパティおよびメソッドを比較しています。constructor はプロトタイププロパティであり、Number コンストラクタ自体を参照します。一方、Number.prototype のメソッドは数値の操作や変換を行い、静的メソッドは型変換機能を提供します。

その他の JavaScript オブジェクトの constructor プロパティ

[編集]

JavaScript では、すべてのオブジェクトが constructor プロパティを持っています。以下は他の組み込みオブジェクトの constructor プロパティの例です:

// 様々な JavaScript オブジェクトの constructor プロパティconstexamples=[{type:'Number',value:newNumber(42)},{type:'String',value:newString('hello')},{type:'Boolean',value:newBoolean(true)},{type:'Array',value:newArray(1,2,3)},{type:'Object',value:newObject({a:1})},{type:'Date',value:newDate()},{type:'RegExp',value:newRegExp('\\d+')},{type:'Function',value:newFunction('return 42')}];console.log('様々な JavaScript オブジェクトの constructor プロパティ:');examples.forEach(({type,value})=>{console.log(`${type}.prototype.constructor === ${type}:`,value.constructor===globalThis[type]);// constructor を使って新しいインスタンスを作成constnewInstance=newvalue.constructor();console.log(`new ${type} instance:`,newInstance);console.log(`instance of ${type}:`,newInstanceinstanceofglobalThis[type]);console.log('---');});

このプログラムでは、様々な JavaScript 組み込みオブジェクトの constructor プロパティを確認し、それらを使用して新しいインスタンスを作成しています。すべての組み込みオブジェクトの constructor プロパティは、そのオブジェクトタイプのコンストラクタ関数を参照しています。

脚註

[編集]
  1. ^Number.prototype.constructor は、すべての JavaScript オブジェクトのプロトタイプに存在するプロパティの一つです。

外部リンク

[編集]


close