程序是用一种相对抽象的方式来描述生活中的信息的。
在JavaScript中,想要描述一个人,可以用下边的代码来表示:
let person = {
name: 'lxx',
age: 12,
sex: '男',
run(){
console.log('跑步')
},
jump(){
console.log('跳跃')
}
}
以上代码,描述了一个人(对象),有自己的属性(name、age、sex)和方法(run、jump)。
要想再描述另外一个人,就需要再创建和上边一样的一个对象,只是将属性对应的值换一下,方法不变。
为了更加方便的创建对象,且不用每次都写属性和方法,我们可以利用构造函数创建一个个的对象,如下代码:
function Person(name, age, sex){
this.name = name
this.age = age
this.sex = sex
this.run = function(){
console.log('跑步')
}
this.jump = function(){
console.log('跳跃')
}
}
// 创建一个张三对象
let zs = new Person('张三', 12, '男')
// 创建一个李四对象
let ls = new Person('李四', 22, '女')
以上代码,定义了一个用来创建人的构造函数,当想要描述一个人的时候,使用 new 关键字,来创建(实例化)一个对象。
- Person:构造函数,将人抽象出一些属性和方法;
- this:实例对象,当使用 new 关键字调用构造函数时创建的实例对象,this就代表这个实例对象;
引用类型的数据【对象、数组、函数】是存放在堆内存中的。引用类型的赋值是指针的赋值或者叫引用地址的赋值。
let obj = {name: 'lxx', age: 12}; // 声明变量obj并赋值对象,obj所存储的是对象的地址(指针)
let info = obj; // 将obj所存储的对象地址赋值给变量info
let arr1 = [111, 222, 333];
let arr2 = arr1;
let fn1 = function(){console.log(666)}
let fn2 = fn1;
用内存图理解一下上边的代码:
当使用构造函数【Person】创建实例对象时,内存图如下所示:
如上内存图中可以看到,每创建一个实例对象,都会在堆中开辟一块内存空间,用来存储一个实例对象中的数据。每个实例对象中的属性如果是引用属性,那么就会在堆中开辟一块空间,用来存储引用类型的数据【对象、数组、函数】。