情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

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が実行される際にはCSymbol.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文から見えなくすることができます。

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-ecmascript 2015, ecmascript 6, Javascript