объект-оболочка
определение
Объекты — самый важный тип данных в языке 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Скобки должны быть добавлены снаружи, иначе оператор точки (.) будет интерпретироваться как десятичная точка.