ラッパーオブジェクト
意味
オブジェクトは、JavaScript 言語の主要なデータ型です。数値、文字列、ブール値の 3 つのプリミティブ型の値は、特定の条件下で自動的にオブジェクト (プリミティブ型の「ラッパー」) に変換されます。
いわゆる「パッケージング オブジェクト」とは、それぞれ数値、文字列、ブール値に対応する 3 つのネイティブ オブジェクト Number
、String
、Boolean
を指します。これら 3 つのネイティブ オブジェクトは、プリミティブ型の値をオブジェクトに (パッケージ化して) 変換できます。
var v1 = 新しい数値(123);
var v2 = 新しい文字列('abc');
var v3 = 新しいブール値(true);
typeof v1 // "オブジェクト"
typeof v2 // "オブジェクト"
typeof v3 // "オブジェクト"
v1 === 123 // false
v2 === 'abc' // false
v3 === true // false
上記のコードでは、プリミティブ型の値に基づいて、対応する 3 つのパッケージング オブジェクトが生成されます。 v1
、v2
、および v3
はすべてオブジェクトであり、対応する単純型の値と等しくないことがわかります。
オブジェクトをラップする設計目的は、第一に、「オブジェクト」型が JavaScript のすべての値をカバーできるようにすることで、言語全体が共通のデータ モデルを持つようにすること、第二に、プリミティブ型の値も同様に扱えるようにすることです。独自のメソッドを呼び出す方法があります。
3 つのネイティブ オブジェクト Number
、String
、および Boolean
がコンストラクターとして呼び出されず (つまり、呼び出し時に new
を追加せずに)、通常の関数として呼び出される場合、これらは多くの場合、あらゆる種類のオブジェクトを変換するために使用されます。数値、文字列、ブール値の場合。
//文字列を数値に変換
Number('123') // 123
//数値を文字列に変換
String(123) // "123"
// 数値をブール値に変換します
Boolean(123) // true
上記のデータ型の変換の詳細については、「データ型の変換」セクションを参照してください。
要約すると、これら 3 つのオブジェクトをコンストラクターとして使用する場合 (new
を使用)、プリミティブ型の値をオブジェクトに変換でき、通常の関数として使用する場合 (new
なし)、任意の型の値を変換できます。プリミティブ型の値に変換します。
##インスタンスメソッド
3 つのパッケージング オブジェクトはそれぞれ、以下で詳しく説明するように、多くのインスタンス メソッドを提供します。ここでは、それらが共有し、Object
オブジェクトから継承する 2 つのメソッド、valueOf()
と toString()
を示します。
valueOf()
valueOf()
メソッドは、ラップされたオブジェクト インスタンスに対応するプリミティブ型の値を返します。
new Number(123).valueOf() // 123
new String('abc').valueOf() // "abc"
new Boolean(true).valueOf() // true
toString()
toString()
メソッドは、対応する文字列形式を返します。
new Number(123).toString() // "123"
new String('abc').toString() // "abc"
new Boolean(true).toString() // "true"
プリミティブ型とインスタンス オブジェクト間の自動変換
場合によっては、プリミティブ型の値がラップされたオブジェクトとして自動的に呼び出されます。つまり、ラップされたオブジェクトのプロパティとメソッドが呼び出されます。このとき、JavaScript エンジンは元の型の値をラップされたオブジェクト インスタンスに自動的に変換し、使用後すぐにインスタンスを破棄します。
たとえば、文字列は「length」プロパティを呼び出して文字列の長さを返すことができます。
'abc'.length // 3
上記のコードでは、abc
はオブジェクトそのものではなく文字列であり、length
プロパティを呼び出すことはできません。 JavaScript エンジンは自動的にそれをラッパー オブジェクトに変換し、このオブジェクトの length
プロパティを呼び出します。呼び出しが完了すると、この一時オブジェクトは破棄されます。これは、プリミティブ型とインスタンス オブジェクトの自動変換と呼ばれます。
var str = 'abc';
str.length // 3
// と同等
var strObj = 新しい文字列(str)
// 弦 {
// 0: "a"、1: "b"、2: "c"、長さ: 3、[[PrimitiveValue]]: "abc"
// }
strObj.length // 3
上記のコードでは、文字列 abc
のラッピング オブジェクトは複数のプロパティを提供しており、length
はそのうちの 1 つにすぎません。
自動変換によって生成されたラッパー オブジェクトは読み取り専用であり、変更できません。したがって、新しい属性を文字列に追加することはできません。
var s = 'Hello World';
s.x = 123;
s.x // 未定義
上記のコードは文字列 s
に x
属性を追加しますが、結果は無効であり、常に unknown
を返します。
一方、ラッパー オブジェクト インスタンスは呼び出しの完了後に自動的に破棄されます。これは、次回文字列のプロパティを呼び出すとき、実際には前回の呼び出しで生成されたオブジェクトではなく、新しく生成されたオブジェクトを呼び出すことになるため、前のオブジェクトに割り当てられたプロパティを取得することはできないことを意味します。文字列に属性を追加したい場合は、そのプロトタイプ オブジェクト String.prototype
でのみ定義できます (「オブジェクト指向プログラミング」の章を参照)。
カスタムメソッド
ネイティブ インスタンス メソッドに加えて、ラッパー オブジェクトは、プリミティブ型の値によって直接呼び出すためのメソッドとプロパティをカスタマイズすることもできます。
たとえば、文字列と数値を 2 倍にする double
メソッドを追加できます。
String.prototype.double = function () {
this.valueOf() + this.valueOf() を返します。
};
'abc'.double()
//abcabc
Number.prototype.double = function () {
this.valueOf() + this.valueOf() を返します。
};
(123).double() // 246
上記のコードは、すべてのインスタンス オブジェクトで呼び出せるように、2 つのオブジェクト String
と Number
のプロトタイプのメソッドをカスタマイズします。最後の行の 123
の周囲に括弧を追加する必要があることに注意してください。そうしないと、次のドット演算子 (.
) が小数点として解釈されます。
作者: wangdoc
アドレス: https://wangdoc.com/
ライセンス: クリエイティブ・コモンズ 3.0