俗话说前端系列

110 阅读2分钟

不定时唠唠

程序是用一种相对抽象的方式来描述生活中的信息的。

在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】创建实例对象时,内存图如下所示:

如上内存图中可以看到,每创建一个实例对象,都会在堆中开辟一块内存空间,用来存储一个实例对象中的数据。每个实例对象中的属性如果是引用属性,那么就会在堆中开辟一块空间,用来存储引用类型的数据【对象、数组、函数】。