前言
在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:'钟晨瑶'}的属性。
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);
我们也可先定义字符串再用[]
往对象中添加属性。
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);
这种方法新增属性的key
为abc
,并没有引用定义的字符串abc
的值。这是因为在对象中,key只能是字符串类型,所以用.abc
添加属性的方法就把abc
当作字符串传给了key
。
创建对象的方式
-
- 创建对象字面量
var obj = {}
简单明了。
- 2. new Object()
var obj2 = new Object();
-
- 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);
new关键字的内部机制
当使用new
关键字调用构造函数时,JS会经历以下步骤:
- 创建一个新的空对象(即
this
对象)。 - 将新对象的原型设置为构造函数的原型对象。
- 执行构造函数的代码,此时
this
变量指向新创建的对象。 - 如果没有返回其他对象,构造函数默认返回
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);
为什么输出结果不是typeOf返回的结果可能是String而是undefined呢?因为 test.sign = 'typeOf返回的结果可能是String' 之后, V8用了valueOf()
方法,判断对象是否为原始值类型。因为test='abc1' 为字符串类型,即原始值类型,字符串类型是不能挂载属性和方法的,所以会在输出结果前把.sign
删除,所以输出结果为undefined。