JavaScript метод Object.prototype.valueOf()
Определение и применение
Метод Object.prototype.valueOf() возвращает сам объект, а не примитив. При вызове через
call() с примитивным получателем возвращает объект-обёртку; для null и
undefined выбрасывает TypeError.
По умолчанию, метод valueOf() наследуется каждым объектом, произошедшим от объекта Object,
он автоматически вызывается когда встречается объект там, где ожидается элементарное значение.
Как правило, метод valueOf() не вызывается явно, а переопределяется в пользовательских объектах, если
этот метод не переопределён в пользовательском объекте, то метод valueOf() возвращает сам объект. Для
объектов типа Object элементарное значение отсутствует, и метод такого объекта возвращает сам объект.
Поддержка браузерами
Спецификация: ecma262
Поддерживается во всех основных браузерах с 2015 года.
| Возможность | Компьютеры | Мобильные | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
valueOf | 1 | 12 | 1 | 3 | 1 | 18 | 4 | 10.1 | 1 | 1.0 | 1 | 1 |
поддерживаетсяс ограниченияминет поддержкинет данных≤31 — не позднее версии 31
JavaScript синтаксис
obj.valueOf();
Спецификация
ECMAScript: Object.prototype.valueOf()
Примеры, попробуйте сами
В примере «Возврат самого объекта» показан результат вызова метода.
Возврат самого объекта
Измените свойства исходного объекта и сравните результат до и после вызова метода.
index.html
<html lang="ru">
<head>
<meta charset="UTF-8" />
<title>Возврат самого объекта</title>
</head>
<body>
<p>Результат выполнения выводится в консоль.</p>
</body>
</html>
main.js
let obj = {
// инициализируем переменную, содержащую объект
a: 1,
b: 2,
c() {
return this.a + this.b
},
}
console.log(obj.valueOf()) // сам объект { a: 1, b: 2, c() }; функция в выводе примера не видна
console.log(obj.valueOf() === obj) // true
В этом примере мы инициализировали переменную, содержащую объект и с помощью метода valueOf() мы
возвращаем сам объект.
В следующем примере мы с Вами рассмотрим как переопределить метод valueOf() по умолчанию:
В примере «Собственный способ преобразования» показан результат вызова метода.
Собственный способ преобразования
Измените свойства исходного объекта и сравните результат до и после вызова метода.
index.html
<html lang="ru">
<head>
<meta charset="UTF-8" />
<title>Собственный способ преобразования</title>
</head>
<body>
<p>Результат выполнения выводится в консоль.</p>
</body>
</html>
main.js
// создадим функцию конструктор
function Calc(a, b) {
this.a = a
this.b = b
}
// создаем объект типа Calc и инициализируем им переменную
let first = new Calc(5, 15)
console.log(first.valueOf()) // {a: 5, b: 15}
// переопределяем метод valueOf() по умолчанию
Calc.prototype.valueOf = function () {
return this.a + this.b
}
console.log(first.valueOf()) // 20
// создаем объект типа Calc и инициализируем им переменную
let second = new Calc(2, 3)
console.log(second.valueOf()) // 5
В этом примере мы создали функцию конструктор Calc и создали объект типа Calc, которым
инициализировали переменную. После этого мы вызываем метод valueOf() на пользовательском объекте и в
качестве возвращаемого значения по умолчанию (унаследованное от Object) получаем сам объект.
После этого мы переопределяем метод valueOf() по умолчанию, который возвращает, сумму значений свойств
a и b объекта и вызываем метод valueOf() снова. Обратите внимание, что в этот
раз мы получаем более полезную информацию. Далее мы создаем еще один объект типа Calc и так же используем
метод valueOf().