В большинстве ситуаций, когда это будет актуально, вы будете неявно звонить 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
, приведет к желаемому поведению.