объект оболочки javascript

JavaScript

объект-оболочка

определение

Объекты — самый важный тип данных в языке JavaScript.Значения трех примитивных типов — чисел, строк и логических значений — автоматически преобразуются в объекты при определенных условиях, то есть «объекты-обертки» примитивных типов.) .

Так называемый «объект-оболочка» относится к соответствующему числовому значению, строке и логическому значению.Number,String,BooleanТри родных объекта. Эти три примитивных объекта могут превращать значения примитивных типов в (обернутые) объекты.

var v1 = new Number(123);
var v2 = new String('abc');
var v3 = new Boolean(true);

typeof v1 // "object"
typeof v2 // "object"
typeof v3 // "object"

v1 === 123 // false
v2 === 'abc' // false
v3 === true // false

В приведенном выше коде три соответствующих объекта-оболочки генерируются на основе значения примитивного типа. можно увидеть,v1,v2,v3являются объектами и не равны соответствующим значениям простого типа.

Дизайнерская цель обертывания объектов состоит, во-первых, в том, чтобы тип «объект» покрывал все значения в JavaScript, весь язык имел общую модель данных, а во-вторых, чтобы значения примитивных типов имели путь вызывать собственные методы.

Number,Stringа такжеBooleanЭти три нативных объекта, если они не вызываются как конструкторы (то есть вызываются без добавленияnew), а как обычный вызов функции, часто используемый для преобразования значений любого типа в числа, строки и логические значения.

// 字符串转为数值
Number('123') // 123

// 数值转为字符串
String(123) // "123"

// 数值转为布尔值
Boolean(123) // true

Подробнее о преобразовании вышеуказанного типа данных см. в разделе «Преобразование типа данных».

Подводя итог, эти три объекта используются как конструкторы (сnew), значение исходного типа может быть преобразовано в объект; при использовании в качестве обычной функции (безnew), можно преобразовать значение любого типа в значение исходного типа.

метод экземпляра

Каждый из трех объектов-оболочек предоставляет ряд методов экземпляра, как описано ниже. Вот два их вида, которые у них общие, отObjectМетоды наследования объектов:valueOf()а такжеtoString().

valueOf()

valueOf()Метод возвращает значение примитивного типа, соответствующего экземпляру объекта-оболочки.

new Number(123).valueOf()  // 123
new String('abc').valueOf() // "abc"
new Boolean(true).valueOf() // true

toString()

toString()Метод возвращает соответствующую строковую форму.

new Number(123).toString() // "123"
new String('abc').toString() // "abc"
new Boolean(true).toString() // "true"

Автоматическое преобразование примитивных типов в объекты-экземпляры

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

Например, строку можно назватьlengthСвойство, возвращающее длину строки.

'abc'.length // 3

В приведенном выше кодеabcявляется строкой, а не самим объектом и не может быть вызванаlengthАтрибуты. Механизм JavaScript автоматически преобразует его в объект-оболочку и вызывает этот объект.lengthАтрибуты.调用结束后,这个临时对象就会被销毁。这就叫原始类型与实例对象的自动转换。

var str = 'abc';
str.length // 3

// 等同于
var strObj = new String(str)
// String {
//   0: "a", 1: "b", 2: "c", length: 3, [[PrimitiveValue]]: "abc"
// }
strObj.length // 3

В приведенном выше коде строкаabcОбъект-оболочка предоставляет несколько свойств,lengthПросто один из них.

Объекты-оболочки, созданные автоматическим преобразованием, доступны только для чтения и не могут быть изменены. Таким образом, строки не могут добавлять новые свойства.

var s = 'Hello World';
s.x = 123;
s.x // undefined

Приведенный выше код представляет собой строкуsдобавилxсвойство, результат недействителен, всегда возвращаетсяundefined.

С другой стороны, после завершения вызова экземпляр объекта-оболочки автоматически уничтожается. Это означает, что когда свойство строки вызывается в следующий раз, фактически вызывается вновь сгенерированный объект, а не объект, сгенерированный в предыдущем вызове, поэтому свойство, назначенное предыдущему объекту, не может быть получено. Если вы хотите добавить свойства к строке, только в ее объекте-прототипеString.prototypeОпределен выше (см. главу "Объектно-ориентированное программирование").

пользовательский метод

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

Например, мы можем добавитьdoubleметод, удваивающий строки и числа.

String.prototype.double = function () {
  return this.valueOf() + this.valueOf();
};

'abc'.double()
// abcabc

Number.prototype.double = function () {
  return this.valueOf() + this.valueOf();
};

(123).double() // 246

Приведенный выше код находится вStringа такжеNumberНа прототипах этих двух объектов соответственно настраивается метод, чтобы его можно было вызывать на всех объектах-экземплярах. Обратите внимание, что последняя строка123Скобки должны быть добавлены снаружи, иначе оператор точки (.) будет интерпретироваться как десятичная точка.