JS包装类

119 阅读3分钟

前言

在JS中,对象是一种极其重要的数据结构,它允许我们以键值对的形式存储数据。同时,JS也提供了所谓的“包装类”,它们能够将原始类型的值转化为对象,从而允许我们对这些值使用对象的方法和属性。本文将深入探讨对象的创建方式以及包装类的工作原理。

对象属性的增减

var mrR = {
    name: 'Ro9nin',
    age: 18,
    sex: 'man',
    HP: 100,
    drink: function() {
        console.log("I'm drunk");
        this.HP++
    },
    smoke: function() {
        console.log("I'm smoking");
        this.HP--
    }
}

console.log(mrR.name) 

mrR.like = '钟晨瑶'
console.log(mrR);

上述代码用mrR.like = '钟晨瑶'直接往mrR中添加了一个{key:like,value:'钟晨瑶'}的属性。

image.png

var mrR = {
    name: 'Ro9nin',
    age: 18,
    sex: 'man',
    HP: 100,
    drink: function() {
        console.log("I'm drunk");
        this.HP++
    },
    smoke: function() {
        console.log("I'm smoking");
        this.HP--
    }
}

console.log(mrR.name) 

var abc = 'like'
mrR[abc] = '钟晨瑶'
console.log(mrR);

我们也可先定义字符串再用[]往对象中添加属性。 image.png

var mrR = {
    name: 'Ro9nin',
    age: 18,
    sex: 'man',
    HP: 100,
    drink: function() {
        console.log("I'm drunk");
        this.HP++
    },
    smoke: function() {
        console.log("I'm smoking");
        this.HP--
    }
}

console.log(mrR.name) 

var abc = 'like'
mrR.abc = '钟晨瑶'
console.log(mrR);

image.png

这种方法新增属性的keyabc,并没有引用定义的字符串abc的值。这是因为在对象中,key只能是字符串类型,所以用.abc添加属性的方法就把abc当作字符串传给了key

创建对象的方式

    1. 创建对象字面量
var obj = {}

简单明了。

  • 2. new Object()
var obj2 = new Object();
    1. new xxx

用new去实例化一个对象

function Car(color){  

    this.name = '川崎H2'
    this.height = 170
    this.weight = 300
    this.color = color
}

let car = new Car('black')
console.log(car);

image.png

new关键字的内部机制

当使用new关键字调用构造函数时,JS会经历以下步骤:

  1. 创建一个新的空对象(即this对象)。
  2. 将新对象的原型设置为构造函数的原型对象
  3. 执行构造函数的代码,此时this变量指向新创建的对象。
  4. 如果没有返回其他对象,构造函数默认返回this对象。 就拿上面的代码举例:
function Car(color){  
    var this ={        //**创建一个新的空对象**(即`this`对象)。
    name : '川崎H2',
    height : 170,
    weight : 300,
    color : color,
    }
    return this     // **执行构造函数的代码**,此时`this`变量指向新创建的对象。
}

包装类

原始值对象,V8执行到包装类时,通过valueOf()试探该包装类是不是原始值,如果时,则秉承原始值不用于有属性和方法的这一规则,再移除掉给包装类添加的属性。

var str = 'abc' // new string('abc')
str += 1        // str = 'abc' + 1  ---> str = 'abc1'
var test = typeof(str)      // 返回 'string'
if(test.length === 6){
    test.sign = 'typeOf返回的结果可能是String'
    // new String(test).sign = 'typeOf返回的结果可能是String'
    // delete test.sign
}
console.log(test.sign);

image.png

为什么输出结果不是typeOf返回的结果可能是String而是undefined呢?因为 test.sign = 'typeOf返回的结果可能是String' 之后, V8用了valueOf()方法,判断对象是否为原始值类型。因为test='abc1' 为字符串类型,即原始值类型,字符串类型是不能挂载属性和方法的,所以会在输出结果前把.sign删除,所以输出结果为undefined。