جاوااسکریپت - تنظیم Map در ES2015 برای پشتیبانی از رفتار دلخواه


من در حال بازی کردن با نقشههای ES2015 هستم و متوجه شدهام که این یک ویژگی عالی است. با این حال، اکنون یک مورد استفاده دارم که نمیتوانم دقیقاً بفهمم آیا میتواند با نقشهها کار کند یا نه.

به کلاس من فکر کن

class A {
     constructor(public a:number) {}
     public equals(obj: A): boolean {
         return this.a === obj.a;
     }
 }

تا جایی که من میفهمم، نقشههای ES2015 از عملگر برابری === استفاده میکنند (با چند استثنا). بنابراین من تعجب میکنم که آیا امکان دارد نوعی تغییر در برابری ایجاد کرد و آن را مجبور کرد تا از متد equals(...) شیء A استفاده کند اگر instanceof باشد؟

در نهایت این چیزی است که من مایل به دستیابی به آن هستم:

var map = new Map();
map.set(new A(8), 7)
map.get(new A(8))      // return 7, not undefined

آیا فکر میکنی من باید کلاس Map خودم را بسازم تا این رفتار را پیادهسازی کنم که بررسی کند آیا هر دو شی نمونهای از A هستند و سپس متد equals(...) را فراخوانی کند؟

پاسخ شماره ۱

شما میتوانید زیرکلاس ایجاد کنید و متد get را مطابق نیاز خود بازنویسی کنید:

class MapByEquals extends Map {
  get(key) {
    for(var k of this.keys()) {
      if(key.equals(k)) {
        return super.get(k);
      }
    }
    return super.get(key);
  }
}

"use strict";
class A {
  constructor(a) {
    this.a = a;
  }
  equals(b) {
    return this.a === b.a;
  }
}

class MapByEquals extends Map {
  get(key) {
    for(var k of this.keys()) {
      if(key.equals(k)) {
        return super.get(k);
      }
    }
    return super.get(key);
  }
}

var map = new MapByEquals();
map.set(new A(8), 7)
console.log(map.get(new A(8)))

آگاه باشید که Babel از توسعه کلاسهای بومی پشتیبانی نمیکند. اما اکثر مرورگرها (Chrome 42+، Firefox 45+) به طور بومی از کلاسها پشتیبانی میکنند و این کار خواهد کرد.