ECMAScript 6の新機能(19)オブジェクト
目次
メソッド定義
ECMAScript 5ではオブジェクトのメソッドは下のように定義しました。
C:\work\node>node
> var obj = {
... method: function () {
..... console.log('method');
..... }
... }
undefined
> obj.method
[Function]
> obj.method()
method
undefined
ECMAScript 6で下のようにより簡潔に定義できるようになりました。
C:\work\node>node
> var obj = {
... method () {
..... console.log('method');
..... }
... }
undefined
> obj.method
[Function: method]
> obj.method()
method
undefined
変数からのオブジェクト作成
ECMAScript 6で変数からオブジェクトを作成することができるようになりました。
C:\work\node>node
> var foo = 100
undefined
> var bar = 200
undefined
> var obj = { foo, bar }
undefined
> obj
{ foo: 100, bar: 200 }
このように、オブジェクト作成時に変数を指定することによりプロパティ名が変数名と同じでプロパティの値が変数の値と同じであるようなプロパティをオブジェクトに追加することができます。
すなわち、下のように記述するのと全く同じです。
C:\work\node>node
> var foo = 100
undefined
> var bar = 200
undefined
> var obj = { foo: foo, bar: bar }
undefined
> obj
{ foo: 100, bar: 200 }
プロパティ名の計算
ECMAScript 6で文字列に加えてシンボルをプロパティ名として指定することができるようになりました。
シンボルとは?
シンボルをプロパティ名として指定する場合には[
と]
で囲みます。
また、式を[
と]
で囲んでプロパティ名に指定することもできるようになりました。
式の評価結果がプロパティ名となります。ただし、式の評価結果が文字列やシンボル以外である場合には文字列に変換されます。
プロパティ名にシンボルを指定する例です。
C:\work\node>node
> var key = Symbol()
undefined
> var obj = {}
undefined
> obj[key] = 100
100
> obj[key]
100
プロパティ名に文字列を返す式を指定する例です。
C:\work\node>node
> var obj = {
... ['pro' + 'p']: 777
... }
undefined
> obj
{ prop: 777 }
> obj.prop
777
プロパティ名にオブジェクトを返す式を指定する例です。
C:\work\node>node
> var obj = {
... [{ foo: 100 }]: 777
... }
undefined
> obj
{ '[object Object]': 777 }
> obj['[object Object]']
777
ただし、プロパティ名が文字列リテラルや数値リテラルである場合には[
と]
で囲む必要はありません。また、プロパティ名が文字列リテラルである場合には'
などで囲む必要もありません。
C:\work\node>node
> var obj = {
... foon: 'foon',
... 3.14: 3.14,
... 0x2534: 2534
... }
undefined
> obj.foon
'foon'
> obj[3.14]
3.14
> obj[0x2534]
2534
また、__proto__
というプロパティ名は特別な扱いを受けます。
[
と]
で囲まないで__proto__
というプロパティ名を指定した場合にはその値はプロパティの値とはならずにオブジェクトのプロトタイプとなります。
[
と]
で囲んで__proto__
というプロパティ名を指定した場合にはその値はプロパティの値となります。
なお、__proto__
というプロパティ名は[
と]
で囲んでいないものと囲んでいるものを1つのオブジェクトで同時に指定することができます。
C:\work\node>node
> var obj = {
... __proto__: { x: 100 },
... ['__proto__']: { y: 200 }
... }
undefined
> Object.getPrototypeOf(obj)
{ x: 100 }
> obj.__proto__
{ y: 200 }
> obj['__proto__']
{ y: 200 }
既定のシンボルをキーとするプロパティ
ECMAScript 6で幾つかの既定のシンボルをキーとするプロパティをオブジェクトに実装することによりオブジェクトの動作を変更することができるようになりました。
Symbol.hasInstance
Symbol.hasInstance
をキーとするメソッドをオブジェクトに実装することによりinstanceof
演算子の動作を変更することができます。
x instanceof C
が実行される際にはC
にSymbol.hasInstance
をキーとするメソッドが実装されている場合には通常の動作の代わりにこのメソッドが呼び出されます。
このメソッドの第1引数はx
であり、返り値としてx instanceof C
の返り値(となる値)を返すようにします。
Symbol.toPrimitive
Symbol.toPrimitive
をキーとするメソッドをオブジェクトに実装することにより数値や文字列へのオブジェクトの暗黙変換の動作を変更することができます。
数値や文字列への暗黙変換が実行される際にはオブジェクトにSymbol.toPrimitive
をキーとするメソッドが実装されている場合には通常の動作の代わりにこのメソッドが呼び出されます。
このメソッドの第1引数はモードであり、返り値として暗黙変換の結果を返すようにします。
モードには下のようなものがあります。
number
・・・オブジェクトを数値に変換すべきです。string
・・・オブジェクトを文字列に変換すべきです。default
・・・オブジェクトを数値か文字列に変換すべきです。
C:\work\node>node
> var obj = {
... [Symbol.toPrimitive] (hint) {
..... if (hint === 'number') {
....... return 100;
....... }
..... else if (hint === 'string') {
....... return 'foo';
....... }
..... else if (hint === 'default') {
....... return 'def';
....... }
..... }
... }
undefined
> 2 * obj
200
> 1 + obj
'1def'
> obj == 'def'
true
> String(obj)
'foo'
> Number(obj)
100
Symbol.toStringTag
Symbol.toStringTag
をキーとするプロパティをオブジェクトに実装することによりtoString
メソッドを呼び出した際に使用されるタグを変更することができます。
> ({}.toString())
'[object Object]'
> ({ [Symbol.toStringTag]: 'Foo' }.toString())
'[object Foo]'
Symbol.unscopables
Symbol.unscopables
をキーとするプロパティをオブジェクトに実装することによりオブジェクトの一部のプロパティをwith
文から見えなくすることができます。
