JS.next

JavaScriptの最新実装情報を追うブログ

@@hasInstanceが実装された

概要

インスタンスであるか判定するためのビルトインシンボルが実装された。


解説

instanceof演算子が「 obj instanceof C 」の形で使われると、「 C[@@hasInstance] 」が定義されていた場合objを引数に呼ばれ、それが返す真偽値が返される。

class X { }

class A {
  static [Symbol.hasInstance](obj) {
    return obj.constructor == X
  }
}


let a = new A, x = new X

console.log( a instanceof A )  // false
console.log( x instanceof A )  // true


ちょっと変わった利用例

型判定に使う

const StringOrNumber = {
  [Symbol.hasInstance](v) {
    return /String|Number/.test( Object.prototype.toString.call(v) )
  }
}

        'str' instanceof StringOrNumber  // true  
        12345 instanceof StringOrNumber  // ture
Object('str') instanceof StringOrNumber  // true
Object(12345) instanceof StringOrNumber  // true
const ArrayCoercible = {
  [Symbol.hasInstance](v) {
    return Object(v) == v && ( 0 <= +v.length || v[Symbol.iterator] )
  }
}


実装されるバージョン

V8 5.0.43