JavaScript里的对象&包装类

223 阅读3分钟

在JavaScript中,对象和包装类是两个密切相关的概念。JavaScript是一种基于原型的语言,它使用对象来表示各种数据结构和实体。而包装类(Wrapper Classes)是JavaScript中的一种特殊对象,它们允许基本数据类型被当作对象来使用

正文

对象

在JavaScript中对象是键值对的集合,其中键是字符串(或者符号,Symbols),值可以是任意类型。对象可以包含多种数据类型,包括基本数据类型对象引用

创建对象

  1. 对象字面量

    let person = {
        name: "张三",
        age: 30,
        greet: function() {
            console.log("你好,我叫" + this.name);
        }
    };
    
  2. 使用 new Object()

    let person = new Object();
    person.name = "李四";
    person.age = 25;
    person.greet = function() {
        console.log("你好,我叫" + this.name);
    };
    
  3. 构造函数

(通常用于批量创建)

```
function Person(name, age) {
    this.name = name;
    this.age = age;
    this.greet = function() {
        console.log("你好,我叫" + this.name);
    };
}

let person = new Person("王五", 28);

```
  1. 使用 Object.create()

    let personProto = {
        greet: function() {
            console.log("你好!");
        }
    };
    
    let person = Object.create(personProto);
    person.name = "赵六";
    person.age = 22;
    

对象属性可以通过点符号(.)或方括号([])访问和修改:

// 点符号
console.log(person.name); // 输出: 张三

// 方括号
console.log(person["age"]); // 输出: 30

JavaScript 对象是动态的,可以在任何时候添加或删除属性:

person.height = 175; // 添加新属性
delete person.age; // 删除属性

包装类

概念

包装类是将基本类型自动转换为对象的过程,是一种隐式过程。这在JavaScript中是自动进行的,不需要开发者手动操作。

举例说明

下面我们来看一些JavaScript中基本类型和对象类型的例子:

var num = '123'
num.abc = 'hello'
console.log(num.abc);//undefined

按理来说上面这段代码应该会报错,因为原始值是不能拥有属性和方法的,属性和方法是对象独有的。但输出的是undefined而没有报错,

我们再来看下面这段:

var num = new Number(123)
num.abc = 'hello'
console.log(num.abc);//hello 
console.log(num * 2);//246

输出hello我们可以理解,var num = new Number(123)这行代码我们可以得到一个实例对象,可以添加属性,我们也可以访问往它身上加的属性。但是当num参与四则运算之后,它就会被认定为是一个Number,会转变为数字。

  • 注意: 用构造函数创建的才转的了,用字面量创建的不行

再来

var str = 'abcd'   
console.log(str.length);//4

都说原始类型没有属性,但是为啥这里又输出4呢?

只有一种可能,str被当做对象来用了。

在结果上,var str = 'abcd' 等同于str = new String('abcd'),但是由于引擎并不知道什么是字面量,即使代码写成前面那样,它也只会采用后者执行。

也就是说引擎是把str直接执行成了对象。

分析

我们再回到第一段代码

var num = '123';//undefined

为什么不会报错,因为引擎把num = '123'当做new Number(123)在执行

好,既然num被当成了一个对象,那为什么在加了属性之后又为undefined呢?

其实中间还有一个delete步骤,在执行var num = '123'时,引擎才反应过来所需要的是个原始类型而不是对象,原始类型没有属性,所以需要自行删除掉。

以上隐式发生的过程即为包装类的过程

结语

以上就是本文全部内容,通过本文,我们了解了JavaScript对象的多样性和灵活性,以及包装类如何扩展基本数据类型的能力,希望能够对读者有所帮助,感谢阅读!