Можно ли сделать оценку объекта JavaScript примитивом? - PullRequest
2 голосов
/ 28 февраля 2020

Я хотел бы иметь возможность определить объект, который будет вычисляться для примитива, но также может иметь прикрепленные функции. Практически так же работает класс "String". Есть ли способ для меня расширить класс без без изменения прототипа String.

Один вариант использования для меня будет выглядеть так:

class ID extends String{
   constructor(len){
      let value = 'Very unique id';
      this.len = len;
      this = value; //Or some other way of assigning the objects value
   }
   someRandomFunction(){
      console.log('I was called');
   }
}

const newId = new ID(10);
console.log(newId) // prints "Very unique id"
newId.someRandomFunction() // prints "I was called"
console.log(newId.len) // prints "10"

1 Ответ

3 голосов
/ 28 февраля 2020

В большинстве ситуаций, когда это будет актуально, вы будете неявно звонить newId[Symbol.toPrimitive](). Вы можете определить эту функцию для вашего объекта, что позволит вам точно определить, как ваш объект ведет себя, когда вы пытаетесь использовать его как разные вещи.

В вашем случае это объект-оболочка вокруг строкового значения , правильно? Вы можете просто вернуть строку для всех вызовов toPrimitive, и, таким образом, любая попытка использовать ваш объект в качестве чего-либо другого, кроме объекта, приведет к выполнению операции над строкой поддержки. Вот пример:

class ID {
   constructor(len){
      this.value = 'Very unique id';
      this.len = len;
   }

   [Symbol.toPrimitive](hint){
      return this.value;
   }

   someRandomFunction(){
      console.log('I was called');
   }
}

const newId = new ID(10);
console.log('' + newId) // prints "Very unique id"
newId.someRandomFunction() // prints "I was called"
console.log(newId.len) // prints "10"

Обратите внимание, что console.log является немного привередливой функцией: она проверяет тип аргумента (который вы не можете изменить), и если это объект, он выигрывает ' Привести его к чему-либо, кроме запуска некоторого кода для проверки свойств объекта. Так что console.log(newId) у вас никогда не будет удовлетворительного пользовательского вывода (если вы не в node.js). Он всегда будет печататься как объект. Однако любая попытка привести объект к примитиву, как в '' + newId, приведет к желаемому поведению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...